diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 75b07ff73b3..5e33bd050ed 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -1787,33 +1787,57 @@ print_info() { INFO "" INFO "If you're using CMake add this to your configuration flags:" + _buildargs="" + if $ALL_STATIC; then - INFO " -D WITH_STATIC_LIBS=ON" + _1="-D WITH_STATIC_LIBS=ON" + INFO " $_1" + _buildargs="$_buildargs $_1" fi if [ -d $INST/boost ]; then - INFO " -D BOOST_ROOT=$INST/boost" - INFO " -D Boost_NO_SYSTEM_PATHS=ON" + _1="-D BOOST_ROOT=$INST/boost" + _2="-D Boost_NO_SYSTEM_PATHS=ON" + INFO " $_1" + INFO " $_2" + _buildargs="$_buildargs $_1 $_2" elif $ALL_STATIC; then - INFO " -D Boost_USE_ICU=ON" + _1="-D Boost_USE_ICU=ON" + INFO " $_1" + _buildargs="$_buildargs $_1" fi if [ -d $INST/osl -a $WITH_OSL == true ]; then - INFO " -D CYCLES_OSL=$INST/osl" - INFO " -D WITH_CYCLES_OSL=ON" - INFO " -D LLVM_VERSION=$LLVM_VERSION_FOUND" + _1="-D CYCLES_OSL=$INST/osl" + _2="-D WITH_CYCLES_OSL=ON" + _3="-D LLVM_VERSION=$LLVM_VERSION_FOUND" + INFO " $_1" + INFO " $_2" + INFO " $_3" + _buildargs="$_buildargs $_1 $_2 $_3" if [ -d $INST/llvm ]; then - INFO " -D LLVM_DIRECTORY=$INST/llvm" - INFO " -D LLVM_STATIC=ON" + _1="-D LLVM_DIRECTORY=$INST/llvm" + _2="-D LLVM_STATIC=ON" + INFO " $_1" + INFO " $_2" + _buildargs="$_buildargs $_1 $_2" fi fi if [ -d $INST/ffmpeg ]; then - INFO " -D WITH_CODEC_FFMPEG=ON" - INFO " -D FFMPEG=$INST/ffmpeg" - INFO " -D FFMPEG_LIBRARIES='avformat;avcodec;avutil;avdevice;swscale;rt;`print_info_ffmpeglink`'" + _1="-D WITH_CODEC_FFMPEG=ON" + _2="-D FFMPEG=$INST/ffmpeg" + _3="-D FFMPEG_LIBRARIES='avformat;avcodec;avutil;avdevice;swscale;rt;`print_info_ffmpeglink`'" + INFO " $_1" + INFO " $_2" + INFO " $_3" + _buildargs="$_buildargs $_1 $_2 $_3" fi + INFO "" + INFO "Or even simpler, just run (in your build dir):" + INFO " make -j$THREADS BUILD_CMAKE_ARGS=\"$_buildargs\"" + INFO "" INFO "If you're using SCons add this to your user-config:" @@ -1832,6 +1856,7 @@ print_info() { if [ -d $INST/boost ]; then INFO "BF_BOOST = '$INST/boost'" + INFO "WITH_BF_BOOST = True" fi if [ -d $INST/ffmpeg ]; then diff --git a/build_files/buildbot/config/user-config-glibc211-i686.py b/build_files/buildbot/config/user-config-glibc211-i686.py index e665657d91e..149a01433a6 100644 --- a/build_files/buildbot/config/user-config-glibc211-i686.py +++ b/build_files/buildbot/config/user-config-glibc211-i686.py @@ -103,7 +103,7 @@ WITH_BF_FFTW3 = True WITH_BF_STATICFFTW3 = True # JACK -WITH_BF_JACK = True +WITH_BF_JACK = False WITH_BF_STATICJACK = True BF_JACK_LIB_STATIC = '${BF_ZLIB}/lib/libjack.a' diff --git a/build_files/buildbot/config/user-config-glibc211-x86_64.py b/build_files/buildbot/config/user-config-glibc211-x86_64.py index 420d9ed4db9..0fae7f0cdb3 100644 --- a/build_files/buildbot/config/user-config-glibc211-x86_64.py +++ b/build_files/buildbot/config/user-config-glibc211-x86_64.py @@ -103,7 +103,7 @@ WITH_BF_FFTW3 = True WITH_BF_STATICFFTW3 = True # JACK -WITH_BF_JACK = True +WITH_BF_JACK = False WITH_BF_STATICJACK = True BF_JACK_LIB_STATIC = '${BF_ZLIB}/lib/libjack.a' diff --git a/build_files/buildbot/config/user-config-glibc27-i686.py b/build_files/buildbot/config/user-config-glibc27-i686.py index b36196fd835..46f3ccb3df7 100644 --- a/build_files/buildbot/config/user-config-glibc27-i686.py +++ b/build_files/buildbot/config/user-config-glibc27-i686.py @@ -92,7 +92,7 @@ WITH_BF_FFTW3 = True WITH_BF_STATICFFTW3 = True # JACK -WITH_BF_JACK = True +WITH_BF_JACK = False # Cycles WITH_BF_CYCLES = True diff --git a/build_files/buildbot/config/user-config-glibc27-x86_64.py b/build_files/buildbot/config/user-config-glibc27-x86_64.py index 7359e155586..23ddcf7a5b9 100644 --- a/build_files/buildbot/config/user-config-glibc27-x86_64.py +++ b/build_files/buildbot/config/user-config-glibc27-x86_64.py @@ -92,7 +92,7 @@ WITH_BF_FFTW3 = True WITH_BF_STATICFFTW3 = True # JACK -WITH_BF_JACK = True +WITH_BF_JACK = False # Cycles WITH_BF_CYCLES = True diff --git a/build_files/buildbot/config/user-config-player-glibc211-i686.py b/build_files/buildbot/config/user-config-player-glibc211-i686.py index 96f201235c4..37fe511fac8 100644 --- a/build_files/buildbot/config/user-config-player-glibc211-i686.py +++ b/build_files/buildbot/config/user-config-player-glibc211-i686.py @@ -103,7 +103,7 @@ BF_BOOST_LIB_STATIC = '${BF_BOOST_LIBPATH}/libboost_filesystem.a ${BF_BOOST_LIBP BF_BOOST_LIBPATH = '${BF_BOOST}/lib' # JACK -WITH_BF_JACK = True +WITH_BF_JACK = False WITH_BF_STATICJACK = True BF_JACK_LIB_STATIC = '${BF_ZLIB}/lib/libjack.a' diff --git a/build_files/buildbot/config/user-config-player-glibc211-x86_64.py b/build_files/buildbot/config/user-config-player-glibc211-x86_64.py index 75979d0bcfe..8f51c5ad8be 100644 --- a/build_files/buildbot/config/user-config-player-glibc211-x86_64.py +++ b/build_files/buildbot/config/user-config-player-glibc211-x86_64.py @@ -103,7 +103,7 @@ BF_BOOST_LIB_STATIC = '${BF_BOOST_LIBPATH}/libboost_filesystem.a ${BF_BOOST_LIBP BF_BOOST_LIBPATH = '${BF_BOOST}/lib' # JACK -WITH_BF_JACK = True +WITH_BF_JACK = False WITH_BF_STATICJACK = True BF_JACK_LIB_STATIC = '${BF_ZLIB}/lib/libjack.a' diff --git a/build_files/buildbot/config/user-config-player-glibc27-i686.py b/build_files/buildbot/config/user-config-player-glibc27-i686.py index 82b105c4527..300af2295f0 100644 --- a/build_files/buildbot/config/user-config-player-glibc27-i686.py +++ b/build_files/buildbot/config/user-config-player-glibc27-i686.py @@ -98,7 +98,7 @@ BF_BOOST_LIB_STATIC = '${BF_BOOST_LIBPATH}/libboost_filesystem.a ${BF_BOOST_LIBP BF_BOOST_LIBPATH = '${BF_BOOST}/lib' # JACK -WITH_BF_JACK = True +WITH_BF_JACK = False # Motion Tracking WITH_BF_LIBMV = False diff --git a/build_files/buildbot/config/user-config-player-glibc27-x86_64.py b/build_files/buildbot/config/user-config-player-glibc27-x86_64.py index 1e6aa4af802..722c3a00a66 100644 --- a/build_files/buildbot/config/user-config-player-glibc27-x86_64.py +++ b/build_files/buildbot/config/user-config-player-glibc27-x86_64.py @@ -98,7 +98,7 @@ BF_BOOST_LIB_STATIC = '${BF_BOOST_LIBPATH}/libboost_filesystem.a ${BF_BOOST_LIBP BF_BOOST_LIBPATH = '${BF_BOOST}/lib' # JACK -WITH_BF_JACK = True +WITH_BF_JACK = False # Motion Tracking WITH_BF_LIBMV = False diff --git a/build_files/scons/tools/btools.py b/build_files/scons/tools/btools.py index 056ebb9b7fe..521138cba6a 100644 --- a/build_files/scons/tools/btools.py +++ b/build_files/scons/tools/btools.py @@ -47,10 +47,10 @@ def get_version(): if (ver_base is not None) and (ver_char is not None) and (ver_cycle is not None): # eg '2.56a-beta' - if ver_cycle: + if ver_cycle != "release": ver_display = "%s%s-%s" % (ver_base, ver_char, ver_cycle) else: - ver_display = "%s%s" % (ver_base, ver_char) # assume release + ver_display = "%s%s" % (ver_base, ver_char) return ver_base, ver_display, ver_cycle diff --git a/doc/python_api/rst/bge.logic.rst b/doc/python_api/rst/bge.logic.rst index 7d20aa31a36..944b1ca06a0 100644 --- a/doc/python_api/rst/bge.logic.rst +++ b/doc/python_api/rst/bge.logic.rst @@ -125,6 +125,10 @@ Variables The current mouse wrapped in an :class:`~bge.types.SCA_PythonMouse` object. +.. data:: joysticks + + A list of attached joysticks. The list size it he maximum number of supported joysticks. If no joystick is available for a given slot, the slot is set to None. + ***************** General functions ***************** @@ -172,7 +176,7 @@ General functions Restarts the current game by reloading the .blend file (the last saved version, not what is currently running). -.. function:: LibLoad(blend, type, data, load_actions=False, verbose=False, load_scripts=True) +.. function:: LibLoad(blend, type, data, load_actions=False, verbose=False, load_scripts=True, async=False) Converts the all of the datablocks of the given type from the given blend. @@ -187,7 +191,13 @@ General functions :arg verbose: Whether or not to print debugging information (e.g., "SceneName: Scene") :type verbose: bool :arg load_scripts: Whether or not to load text datablocks as well (can be disabled for some extra security) - :type load_scripts: bool + :type load_scripts: bool + :arg async: Whether or not to do the loading asynchronously (in another thread). Only the "Scene" type is currently supported for this feature. + :type async: bool + + :rtype: :class:`bge.types.KX_LibLoadStatus` + + .. note:: Asynchronously loaded libraries will not be available immediately after LibLoad() returns. Use the returned KX_LibLoadStatus to figure out when the libraries are ready. .. function:: LibNew(name, type, data) diff --git a/doc/python_api/rst/bge.types.rst b/doc/python_api/rst/bge.types.rst index 8cf9ccb794c..470e1c56bac 100644 --- a/doc/python_api/rst/bge.types.rst +++ b/doc/python_api/rst/bge.types.rst @@ -141,6 +141,74 @@ Types :type: boolean +.. class:: SCA_PythonJoystick(PyObjectPlus) + + A Python interface to a joystick. + + .. attribute:: name + + The name assigned to the joystick by the operating system. (read-only) + + :type: string + + .. attribute:: activeButtons + + A list of active button values. (read-only) + + :type: list + + .. attribute:: axisValues + + The state of the joysticks axis as a list of values :data:`numAxis` long. (read-only). + + :type: list of ints. + + Each specifying the value of an axis between -1.0 and 1.0 depending on how far the axis is pushed, 0 for nothing. + The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. + + * left:[-1.0, 0.0, ...] + * right:[1.0, 0.0, ...] + * up:[0.0, -1.0, ...] + * down:[0.0, 1.0, ...] + + .. attribute:: hatValues + + The state of the joysticks hats as a list of values :data:`numHats` long. (read-only). + + :type: list of ints + + Each specifying the direction of the hat from 1 to 12, 0 when inactive. + + Hat directions are as follows... + + * 0:None + * 1:Up + * 2:Right + * 4:Down + * 8:Left + * 3:Up - Right + * 6:Down - Right + * 12:Down - Left + * 9:Up - Left + + .. attribute:: numAxis + + The number of axes for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: numButtons + + The number of buttons for the joystick at this index. (read-only). + + :type: integer + + .. attribute:: numHats + + The number of hats for the joystick at this index. (read-only). + + :type: integer + .. class:: SCA_IObject(CValue) This class has no python functions @@ -1861,6 +1929,44 @@ Types :type: boolean +.. class:: KX_LibLoadStatus(PyObjectPlus) + + An object providing information about a LibLoad() operation. + + .. code-block:: python + + # Print a message when an async LibLoad is done + import bge + + def finished_cb(status): + print("Library (%s) loaded in %.2fms." % (status.libraryName, status.timeTaken)) + + bge.logic.LibLoad('myblend.blend', 'Scene', async=True).onFinish = finished_cb + + .. attribute:: onFinish + + A callback that gets called when the lib load is done. + + :type: callable + + .. attribute:: progress + + The current progress of the lib load as a normalized value from 0.0 to 1.0. + + :type: float + + .. attribute:: libraryName + + The name of the library being loaded (the first argument to LibLoad). + + :type: string + + .. attribute:: timeTaken + + The amount of time, in seconds, the lib load took (0 until the operation is complete). + + :type: float + .. class:: KX_LightObject(KX_GameObject) A Light object. @@ -3977,7 +4083,7 @@ Types :type: list of ints. - Each spesifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing. + Each specifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing. The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls. * left:[-32767, 0, ...] @@ -4001,7 +4107,7 @@ Types :type: list of ints - Each spesifying the direction of the hat from 1 to 12, 0 when inactive. + Each specifying the direction of the hat from 1 to 12, 0 when inactive. Hat directions are as follows... diff --git a/extern/libmv/CMakeLists.txt b/extern/libmv/CMakeLists.txt index ebc5953d956..a51f576d965 100644 --- a/extern/libmv/CMakeLists.txt +++ b/extern/libmv/CMakeLists.txt @@ -47,9 +47,9 @@ set(SRC libmv/multiview/conditioning.cc libmv/multiview/euclidean_resection.cc libmv/multiview/fundamental.cc + libmv/multiview/homography.cc libmv/multiview/projection.cc libmv/multiview/triangulation.cc - libmv/multiview/homography.cc libmv/numeric/numeric.cc libmv/numeric/poly.cc libmv/simple_pipeline/bundle.cc @@ -71,8 +71,8 @@ set(SRC libmv/tracking/lmicklt_region_tracker.cc libmv/tracking/pyramid_region_tracker.cc libmv/tracking/retrack_region_tracker.cc - libmv/tracking/trklt_region_tracker.cc libmv/tracking/track_region.cc + libmv/tracking/trklt_region_tracker.cc third_party/fast/fast_10.c third_party/fast/fast_11.c diff --git a/extern/libmv/ChangeLog b/extern/libmv/ChangeLog index 02b79c93ec2..c52d5456c32 100644 --- a/extern/libmv/ChangeLog +++ b/extern/libmv/ChangeLog @@ -1,3 +1,487 @@ +commit cfabdfe48df2add3d1f30cf4370efd0b31990ab0 +Author: Sergey Sharybin +Date: Thu Dec 20 05:46:53 2012 +0600 + + Assorted fixes for keyframe selection: + + - Biggest error was in cost functors used for F and H refirement, + they were just wrong. + + - Use natural logarithms, since it's actually makes sense from + math papers point of view and error is somewhere else. + + - Disabled rho for GRIC, for now use non-clamped error for tests. + + - Made SymmetricEpipolarDistance returning non-squared distance + Keyframe selection is currently the only used of this function + and it seems using non-squared distance makes much more sense. + + Also would think to append suffix "Squared" to functions which + returns squared distances. + + - Removed templated version of SymmetricEpipolarDistance, since + it's not needed actually. + + This is actually even worse working than previous implementation, + but commit it needed for further review. + +commit 35d8c57626ad74818f155e6e5960c663ea84e032 +Author: Sergey Sharybin +Date: Thu Dec 20 03:00:40 2012 +0600 + + Euclidean resection cost function didn't use correct constructor + + It was storing a reference to initial rotation passed by value, + leading to pointer being pointing to a stack variable, leading to + wrong memory access in residuals computing. + + Apparently was visible in optimized builds only with inline + substitution allowed. + +commit 0798d3162bb49cee7e1c423ceccbca1326ad5650 +Author: Sergey Sharybin +Date: Thu Dec 20 02:50:52 2012 +0600 + + Automatic keyframe selection based on Pollefeys's criteria + + This commit implements automatic keyframe selection algorithm + based on Pollefeys's criteria (F-GRIC is smaller than H-GRIC + and correspondence ratio is more then 90%). + + It is implemented as a part of simple pipeline and returns + vector of keyframe images for a given Tracks structure. + + For simple pipeline reconstruction two best keyframes are + expected to be selected from all detected candidates. + Criteria for this selection could be reprojection error of + solution from two candidate keyfames. + + Unfortunately, it's not fully workable yet, hopefully would + be fixed soon. + +commit e943985552f0598ae122252876f305d72c25c2f9 +Author: Sergey Sharybin +Date: Thu Dec 6 17:47:11 2012 +0600 + + Camera Tracking: allow fallback to reprojection resection + by user demand + + This fixes some "regressions" introduced in previous commit + which lead to much worse solution in some cases. Now it's + possible to bring old behavior back. + + Perhaps it's more like temporal solution for time being smarter + solution is found. But finding such a solution isn't so fast, + so let's bring manual control over reprojection usage. + + But anyway, imo it's now nice to have a structure which could + be used to pass different settings to the solver. + +commit 5a23d01dd531d1e0798298d17ba42a3397effb82 +Author: Keir Mierle +Date: Thu Sep 20 18:55:44 2012 +0000 + + Make Euclidean resection "always" succeed. + + The Euclidean resection code had a magical constant, 1e-3, used to + compare the results of solving an equation. This failure detection + was well-intended, trying to prevent poor solutions from getting + made without notifying the caller. Unfortunately in practice, this + threshold is too conservative. Furthermore, it is not clear the + threshold should exist at all; the purpose of the Euclidean + resection is to come up with the best solution it can; other + methods (e.g. reprojection error) should be used to compare + whether the method succeeded. + + This commit changes the Euclidean EPnP code to always succeed, + causing the previous fallback to projective resection to never + run. In most cases, this will result in better reconstructions. + + This should, in most cases, fix the dreaded "flipping" problem. + +commit 57dad861d2a7f9d058c6d8edde1a2d51d7225a51 +Author: Keir Mierle +Date: Thu Sep 20 02:27:34 2012 +0000 + + Fix variable naming in the planar tracker. + +commit e9392fd3b46f5668662935696e7d9afac3390ca4 +Author: Keir Mierle +Date: Thu Sep 20 02:10:33 2012 +0000 + + Add smarter tolerance checking in the planar tracker. + + The planar tracker uses Ceres for the refinement stage. During + refinement, Ceres iteratively updates the parameters with the + latest best guess. If the change in the parameters falls below a + threshold, Ceres will abort successfully ("converged"). + + For the case of pure translation tracking, the parameters are + exactly the two pixel shifts (dx, dy), and measuring the change in + these parameters gives a meaningful termination criterion. + However, for all the other parameterizations like affine, where + the parameterization involves affine parameters that have no + physical interpretation, Ceres is left with no way to terminate + the solver early. With the existing code, often many iterations + are run long after Ceres has found a solution sufficiently + accurate for all tracking needs. No one needs tracking with + a quadrillionth of a pixel accuracy; that time is wasted. + + This patch extends the existing iteration callback that is passed + in to Ceres to check if the pattern has fallen out of the search + window, to also check if the optimizer has made a tiny step. In + particular, if the maximum shift of any patch corner between two + successful optimizer steps is less than a threshold (currently + 0.005 pixels), the track is declared successful and tracking + is terminated. + + This leads to dramatic speed increases in some cases, with little + to no loss in track quality. This is especially apparent when + tracking patches with affine or perspective motion models. For + example, on some tracking cases I tried, the iterations Ceres took + went from 50 to 3. + +commit 36729c19bf90cb767e9adb96ba7dd48a5ace2be1 +Author: Keir Mierle +Date: Wed Sep 19 22:25:02 2012 +0000 + + Detect too-small planar tracking patches. + + The planar tracker did not detect very skinny patches which have + effectively zero area and are untrackable. This adds detection and + rejection of patterns with zero area. This fixes a crash found by + during Mango production. + +commit 5cf2bae255a5a0f2e36ea0516670782cb88b589d +Author: Sergey Sharybin +Date: Thu Dec 6 17:33:53 2012 +0600 + + Real fix for previous commit from Keir. He's comment; + + Cleanup for when trackers fall out of the search window. + + Sergey originally left a TODO() here, but his fix is the correct + one. I removed the TODO and fixed some comment issues. + +commit a11533918720e5b43dc1e95895db0eb36c8c06aa +Author: Sergey Sharybin +Date: Thu Dec 6 17:31:16 2012 +0600 + + Fix crash when tracking in planar motion model (and maybe some other) + + It was an Abort() caused by check for solver result not equal to USER_ABORT. + + In some cases solver returns USER_ABORT due to BoundaryCheckingCallback + detects coordinates does not belong to image. + + Somehow this callback wasn't called in previous version of Ceres and + in the same case marker was jumping. Now when the callback is called + it seems we could simply return failure of tracking without aborting + Blender. + + Probably this is in fact some issue somewhere else, would double + check with Keir about this. + +commit 4be2306bcc664b259aaf7068b9f32ab60124a509 +Author: Sergey Sharybin +Date: Thu Dec 6 17:29:39 2012 +0600 + + Resolved some compilation warnings (missed prototypes) + + In some cases it was missed include of header file, in some other + cases symbol could be static. + +commit bef729ba5c12683d13584d2a728b8b6506b7ca90 +Author: Sergey Sharybin +Date: Thu Dec 6 17:27:17 2012 +0600 + + Code cleanup: silence some -Wnarrowing warnings from C++11 + +commit add1415d896818367087c784a3013dd8f1bb2095 +Author: Sergey Sharybin +Date: Thu Dec 6 17:25:18 2012 +0600 + + Changes to SamplePlanarPatch to support mask input and + added output for pattern center. + +commit daa354c0735b954b0cd7725626e9a3d67416d46b +Author: Keir Mierle +Date: Sat Jun 9 19:22:39 2012 +0000 + + Change libmv's bilinear sampling to assume the same + pixel conventions as Blender. This fixes the preview + widget in Blender, and should make tracking slightly + more accurate. + +commit 99b6222873fbfbe248316316956720376a58f438 +Author: Keir Mierle +Date: Sat Jun 9 18:58:51 2012 +0000 + + Add new warp regularization scheme for planar tracking. + + This adds a new term to the tracking cost function that + restricts how much the optimizer can warp the patch (as + opposed to merely adjusting the translation). This should + reduce the "jumpiness" that is sometimes seen when doing + non-"Loc" tracks. + + It is disabled in this commit; a subsequent commit will add + controls to the tracking dialog for this. + +commit a1c5a70badd11cba0470700bad2eac2b2bd30c86 +Author: Keir Mierle +Date: Sat Jun 9 06:55:21 2012 +0000 + + Planar tracker polish. + + - Fixes the correlation checking code that was broken in the + previous commit. The bug was a transpose error. + - Fixes a memory leak of the warp functor, found by Sameer. + - Various cleanups done at Sameer's suggestion. + + Thanks to Sameer Agarwal for a code review. + +commit 2cb784caa854a77cdd43620ab133f26b87ed0d83 +Author: Keir Mierle +Date: Fri Jun 8 17:42:17 2012 +0000 + + Make planar tracking much faster. + + - This makes planar tracking around 2-3x or more faster than + before, by rearranging how the sampling is done. + Previously, the source patch was sampled repeatedly on + every optimizer iteration; this was done for + implementation speed, but was wasteful in computation. + + - This also contains some additions to Ceres to help + deailing with mixed numeric / automatic differentation. In + particular, there is now a "Chain::Rule" operator that + facilitates calling a function that takes Jet arguments, + yet does numeric derivatives internally. This is used to + mix the numeric differentation of the images with the warp + parameters, passed as jets by Ceres to the warp functor. + + There is also a new "JetOps" object for doing operations + on types which may or may not be jets, such as scaling + the derivative part only, or extracting the scalar part + of a jet. + + This patche is aimed at Ceres upstream. + + - A new function for sampling a patch is now part of the + track_region.h API; this will get used to make the preview + widget properly show what is getting tracked. Currently + the preview widget does not handle perspective tracks. + + Known issues: + + This patch introduces a bug such that the "Minimum + Correlation" flag does not work; if it is enabled, tracking + aborts immediately. The workaround for now is to disable the + correlation checking, and examine your tracks carefully. A + fix will get added shortly. + +commit 81d028f13738ebe2304287dfce90e91bc782e2cf +Author: Keir Mierle +Date: Fri May 18 20:04:43 2012 +0000 + + Remove an unnecessary template<> line in libmv. Convert debug logs to LG. + +commit 238aaba241ef99995d254aadc974db719da04b96 +Author: Keir Mierle +Date: Fri May 18 12:05:10 2012 +0000 + + Support normalization in the tracking prepass + + The last tracker commit added normalized tracking. This makes + tracking patches undergoing uniform illumination change easier. + However, the prepass which computes a quick translation-only + estimate of the warp did not take this into account. This commit + fixes that. + + This works reasonably well but in some examples the brute + initialization fails. I suspect this is due to the warped template + estimate in the current frame being too different from the + original, so there are multiple peaks in the normalized-SAD + correlation function. + + The solution is to use the previous frame for the brute + initialization and the keyframe for refinement, but that requires + architecture changes. + +commit 981ca4f6a679cd9ac3d086eae3cd946ce72ca8a5 +Author: Keir Mierle +Date: Fri May 18 02:12:47 2012 +0000 + + Add light-normalized tracking to the planar tracker + + This commit adds the ability to normalize patterns by their + average value while tracking, to make them invariant to global + illumination changes. + + To see this in action, check out the "Lobby" scene from Hollywood + VFX. If you track the markers that are shadowed by the actress, + previously they would not track. With the scale adaption on, the + tracker would shrink the area to compensate for the changed + illumination, losing the track. With "Normalize" turned on, the + patch is correctly tracked and scale is maintained. + + A remaining problem is that only the Ceres cost function is + updated to handle the normalization. The brute translation search + does not take this into account. Perhaps "Prepass" (see below) + should get disabled if normalization is enabled until I fix the + prepass to normalize as well. + + There are a few other changes: + + - Bail out of the sampling loop early if the mask is zero; this + saves expensive samples of the image derivatives. + + - Fix a bug where the mask was ignored when sampling in the cost + functor. + +commit e9384b15fb2a6a5b81346d5758fa136f0911e945 +Author: Keir Mierle +Date: Thu May 17 23:53:32 2012 +0000 + + Implement support for affine tracking in the planar tracker; cleanups. + +commit 021d41eed8b4ce6a4e37786ccd357ed5dc83a13f +Author: Keir Mierle +Date: Thu May 17 21:26:06 2012 +0000 + + For the planar tracker, initialize the warp from the four correspondences + after brute force translation search. + +commit 003d1bf6145cfd30938b35f6e10d43708dbf916c +Author: Sergey Sharybin +Date: Thu Dec 6 16:56:01 2012 +0600 + + Correction to region tracker options initialization. + + Based on patch from Keir to Blender: + https://svn.blender.org/svnroot/bf-blender/branches/soc-2011-tomato@46743 + +commit 6af47b218cfdf5219f0ebb3cb95459817cf9abf2 +Author: Keir Mierle +Date: Thu May 17 02:31:52 2012 +0000 + + Add new planar tracker features and use the new planar API + + This commit removes the use of the legacy RegionTracker API from + Blender, and replaces it with the new TrackRegion API. This also + adds several features to the planar tracker in libmv: + + - Do a brute-force initialization of tracking similar to "Hybrid" + mode in the stable release, but using all floats. This is slower + but more accurate. It is still necessary to evaluate if the + performance loss is worth it. In particular, this change is + necessary to support high bit depth imagery. + + - Add support for masks over the search window. This is a step + towards supporting user-defined tracker masks. The tracker masks + will make it easy for users to make a mask for e.g. a ball. + + - Add Pearson product moment correlation coefficient checking (aka + "Correlation" in the UI. This causes tracking failure if the + tracked patch is not linearly related to the template. + + - Add support for warping a few points in addition to the supplied + points. This is useful because the tracking code deliberately + does not expose the underlying warp representation. Instead, + warps are specified in an aparametric way via the correspondences. + + - Remove the "num_samples_xy" concept and replace it with + automatic determination of the number of samples. This makes the + API easier for users. + + - Fix various bugs in the parameterizations. + + There remains a bug with subpixel precision tracking when in + "keyframe" mode; this will get fixed shortly. + +commit 16a46db104468cec80bd31ca9d5f8bffbe3e003e +Author: Keir Mierle +Date: Mon May 14 12:15:38 2012 +0000 + + "Efficient Second-order Minimization" for the planar tracker + + This implements the "Efficient Second-order Minimization" + scheme, as supported by the existing translation tracker. + This increases the amount of per-iteration work, but + decreases the number of iterations required to converge and + also increases the size of the basin of attraction for the + optimization. + +commit 23243b1b1f3e1ab3ef862b47bca06ee876ac2cf4 +Author: Keir Mierle +Date: Sun May 13 23:08:56 2012 +0000 + + Add a planar tracking implementation to libmv + + This adds a new planar tracking implementation to libmv. The + tracker is based on Ceres[1], the new nonlinear minimizer that + myself and Sameer released from Google as open source. Since + the motion model is more involved, the interface is + different than the RegionTracker interface used previously + in Blender. + + The ESM tracker, also known as the KLT tracker in the UI, is + temporarily changed to use the new Ceres-based planar + tracker in translation-only mode. Currently it is a bit + slower than ESM and also doesn't have all the bells and + whistles implemented. Those will come soon. Longer term, + both trackers will remain since Ceres is unlikely to be as + fast as ESM for pure translation solving, due to its + generality. + + The next step is to implement a new tracking UI. The current + UI assumes a translational motion model; the new one must + support arbitrary perspective transforms of the pattern + regions. + + [1] http://code.google.com/p/ceres-solver + +commit 52be92b53eb4decb1a316690b162196f227cc441 +Author: Sergey Sharybin +Date: Thu Dec 6 16:06:08 2012 +0600 + + Initial Ceres integration + + Currently only put sources to src/third_party/ceres and made sure they're + not giving compilation issues. + + Used Ceres upstream version 1.3.0. + + Needed to make some modifications to it's CMakeLists.txt also to glog and + fglags. They're described in README.libmv of this libraries. + + Basically: + + - Added -fPIC to glog/gflags, so shared ceres library could be linked + statically against this libraries. + + - Tweaked Ceres's build rules to use needed libraries from libmv's + third_party folder. + +commit b13f9d13122e091cb85855c2094386ccdef6e5a4 +Author: Sergey Sharybin +Date: Wed Dec 5 19:05:34 2012 +0600 + + Update Eigen to version 3.1.2 + + Mainly because of lots of warnings generating by gcc-4.7 which are + resolved in newer eigen version. + +commit 1f0dd94e8e37d3fe2df89282ec16a6a685fdde0b +Author: Sergey Sharybin +Date: Fri May 25 16:36:44 2012 +0600 + + - Added avutil to qt-tracker linking when building with FFmpeg support. + On some platforms it seems to be required + - Synchronized QT Creator project for qt-tracker with changes in sources, + so no it might be compiled from QT Creator. + commit b813dbe3f46bbbc7e73ac791d4665622e4fc7ba5 Author: Sergey Sharybin Date: Wed May 9 19:01:10 2012 +0600 @@ -238,319 +722,3 @@ Date: Fri Feb 17 20:08:01 2012 +0600 SAD tracker now can deal with pattern size any size, Very quick implementation came from Blender before Hybrid tracker was added. Better to be replaced with brute tracker. - -commit d547c9cfe37d5d3397d33c8b0e58471e1e1c1634 -Author: Sergey Sharybin -Date: Fri Feb 17 20:03:52 2012 +0600 - - Just convert end of lines to unix style. - -commit eb73ddbaec5b9e1ad30331bbf858a6ebc266c4aa -Author: Sergey Sharybin -Date: Fri Feb 17 20:02:20 2012 +0600 - - Made some function static. Resolves possible linking issues when building with MinGW. - -commit 2930681fafd86e4f4a958054b1db8bfff29623d1 -Author: Sergey Sharybin -Date: Fri Feb 17 19:59:45 2012 +0600 - - Missed this in commit with improvements in camera intrinsics. - -commit 8d31bc767019b05c5bf8c9f309f9545b3428afa1 -Author: Sergey Sharybin -Date: Fri Feb 17 19:57:51 2012 +0600 - - Another step of syncing codebase with Blender. - Mainly fixes for freebsd/osx compilation and aligned memory allocation. - -commit 3214a2df5bfd98021f25d0f1a626a86318bb245f -Author: Sergey Sharybin -Date: Fri Feb 17 19:48:02 2012 +0600 - - Support compilation on FreeBSD platform - -commit 0e5abe96f543687ccfb3a923ec639cb8f45d54f8 -Author: Sergey Sharybin -Date: Fri Feb 17 19:44:18 2012 +0600 - - Implementation of basic system for progress reporting into callee stuff - - Implemented by using simple callbacks classes which are getting invoked from - places where lots of calculation happens, so applications which are using - libmv may display nice progress bar. - -commit c5e18fe35464618055e0e9761be8d22fae56db49 -Author: Keir Mierle -Date: Fri Feb 17 19:25:45 2012 +0600 - - Add support for detecting tracking failure in the ESM tracker component of - libmv. Since both KLT and Hybrid rely on ESM underneath, KLT and Hybrid now - have a minimum correlation setting to match. With this fix, track failures - should get detected quicker, with the issue that sometimes the tracker will - give up too easily. That is fixable by reducing the required correlation (in - the track properties). - -commit ea0fed736ecdcc8c020227aeef8ef4cd3be5e63d -Author: Keir Mierle -Date: Fri Feb 17 19:23:50 2012 +0600 - - Add a new hybrid region tracker for motion tracking to libmv, and - add it as an option (under "Hybrid") in the tracking settings. The - region tracker is a combination of brute force tracking for coarse - alignment, then refinement with the ESM/KLT algorithm already in - libmv that gives excellent subpixel precision (typically 1/50'th - of a pixel) - - This also adds a new "brute force" region tracker which does a - brute force search through every pixel position in the destination - for the pattern in the first frame. It leverages SSE if available, - similar to the SAD tracker, to do this quickly. Currently it does - some unnecessary conversions to/from floating point that will get - fixed later. - - The hybrid tracker glues the two trackers (brute & ESM) together - to get an overall better tracker. The algorithm is simple: - - 1. Track from frame 1 to frame 2 with the brute force tracker. - This tries every possible pixel position for the pattern from - frame 1 in frame 2. The position with the smallest - sum-of-absolute-differences is chosen. By definition, this - position is only accurate up to 1 pixel or so. - 2. Using the result from 1, initialize a track with ESM. This does - a least-squares fit with subpixel precision. - 3. If the ESM shift was more than 2 pixels, report failure. - 4. If the ESM track shifted less than 2 pixels, then the track is - good and we're done. The rationale here is that if the - refinement stage shifts more than 1 pixel, then the brute force - result likely found some random position that's not a good fit. - -commit a07fff8431621c01d81ae52595d8dd91a295a776 -Author: Keir Mierle -Date: Fri Feb 17 19:19:58 2012 +0600 - - Assorted camera tracker improvements - - - Add support for refining the camera's intrinsic parameters - during a solve. Currently, refining supports only the following - combinations of intrinsic parameters: - - f - f, cx, cy - f, cx, cy, k1, k2 - f, k1 - f, k1, k2 - - This is not the same as autocalibration, since the user must - still make a reasonable initial guess about the focal length and - other parameters, whereas true autocalibration would eliminate - the need for the user specify intrinsic parameters at all. - - However, the solver works well with only rough guesses for the - focal length, so perhaps full autocalibation is not that - important. - - Adding support for the last two combinations, (f, k1) and (f, - k1, k2) required changes to the library libmv depends on for - bundle adjustment, SSBA. These changes should get ported - upstream not just to libmv but to SSBA as well. - - - Improved the region of convergence for bundle adjustment by - increasing the number of Levenberg-Marquardt iterations from 50 - to 500. This way, the solver is able to crawl out of the bad - local minima it gets stuck in when changing from, for example, - bundling k1 and k2 to just k1 and resetting k2 to 0. - - - Add several new region tracker implementations. A region tracker - is a libmv concept, which refers to tracking a template image - pattern through frames. The impact to end users is that tracking - should "just work better". I am reserving a more detailed - writeup, and maybe a paper, for later. - - - Other libmv tweaks, such as detecting that a tracker is headed - outside of the image bounds. - - This includes several changes made directly to the libmv extern - code rather expecting to get those changes through normal libmv - channels, because I, the libmv BDFL, decided it was faster to work - on libmv directly in Blender, then later reverse-port the libmv - changes from Blender back into libmv trunk. The interesting part - is that I added a full Levenberg-Marquardt loop to the region - tracking code, which should lead to a more stable solutions. I - also added a hacky implementation of "Efficient Second-Order - Minimization" for tracking, which works nicely. A more detailed - quantitative evaluation will follow. - -commit 0bf66c009d5022eacfc473d247884a73ffeefa8f -Author: Sergey Sharybin -Date: Fri Feb 17 19:13:49 2012 +0600 - - Rest of compilation fix with FAST library. - -commit 71b578ca2ba34c528363c514cd1fcc85791d01f3 -Author: Keir Mierle -Date: Fri Feb 17 19:00:28 2012 +0600 - - Improve the KLT tracking behaviour and UI - - - Remove the overly-conservative use of libmv's re-track tracker. The re-track - tracker would take a normal tracker such as TRKLT or KLT or pyramid KLT, and - track from frame 1 to 2, then back from the position found in 2 back to 1. - Then, when the reverse-track doesn't match the original track with high - precision, the track is considered "failed". This is a good approach for - fully automatic reconstruction, but is too conservative for supervised - tracking. - - The retrack-tracker will return when fully automatic tracking is added. - - - Always solve for (dx, dy) in the TRKLT loop even if the linear system is - ill-conditioned. The client (Blender in this case) can still use the solved - position, even though it is less reliable. - -commit 7d8a8762f2bc2e36f95b0b6f4fb4ca996f9f0db7 -Author: Sergey Sharybin -Date: Fri Feb 17 18:46:24 2012 +0600 - - Changes in camera intrinsics distortion/undistortion: - - - Distortion/undistortion of scaled images wasn't happening right, - because camera intrinsics are calibrated on an original frame which - has got some particular resolution and trying to apply this model on - an image with another resolution gives totally wrong result. - This is needed to be able to do post-prccessing of render, running - distortion on a scene which might be rendered with higher resolution - than footage itself and then be scaled down. - - Fixed incorrect calculation/applying of precomputed grid when - distortion is high high enough and produces pixel offset higher - than 127 pixels. This might be still not very distorted image, - but if it's a 4K footage "normal" camera will easily give such - a distortion. - - Added support of overscan distortion/undistortion. - -commit ed080785d63bb8e3a13dde51a2dc94fe59b059bb -Author: Sergey Sharybin -Date: Fri Feb 17 18:38:51 2012 +0600 - - Fast headers now can be included from C++ sources. - Was needed to make it working fine when bundling in Blender but might also - be needed to bundle into another applications. - -commit 5f5a7aa46a2d87b96c8098dfc8682f4d01b5cd40 -Author: Sergey Sharybin -Date: Fri Feb 17 18:36:16 2012 +0600 - - Bring back FAST detector which seems to be working much nicer than Morravec. - Both of them are available in API. - -commit 2cab13c18216fb684b270cec077f7300262584af -Author: Sergey Sharybin -Date: Fri Feb 17 18:27:36 2012 +0600 - - Revert "Make CameraIntrinsics (and thus Qt tracker) compilable without linking libmv." - - This reverts commit 81613ee0cc94b315f333c9632b18b95d426aad05. - - That commit made inverting intrinsics totally unworkable, so reverted this and - made needed tweaks to qt-tracker project file to make it compilable (was needed - to make it linking together with glog). - - Conflicts: - - src/ui/tracker/tracker.cc - src/ui/tracker/tracker.pro - -commit ec46cae041401b17afb4fe4d9c9343d10797090f -Author: Sergey Sharybin -Date: Fri Feb 17 17:59:55 2012 +0600 - - Fix compilation error using official MinGW - -commit 6fbc370e922c47cfa35381662b6c439f4891ed74 -Author: Sergey Sharybin -Date: Fri Feb 17 17:38:20 2012 +0600 - - Fix compilation error with MSVC 2010 which is more picky for "missed" STL headers - -commit be9e6b63691d83b551a085f0766878bd84220767 -Author: Sergey Sharybin -Date: Fri Feb 17 17:36:18 2012 +0600 - - Fix compilation with MSVC where snprintf function is declared as unsafe and _snprintf should be used instead. - - Better to switch to own implementation will ensure string is correctly NULL-terminated. - -commit 1847d9e414ed763cd80668775d7d9f79575fc8ca -Author: Sergey Sharybin -Date: Fri Feb 17 17:34:45 2012 +0600 - - Fix compilation error on OSX caused by incorrect access to ucontext - -commit 90579b6ffad07672172a1c240499615b30b25549 -Merge: b9aac30 531c79b -Author: Sergey Sharybin -Date: Fri Feb 17 18:32:52 2012 +0600 - - Merge remote-tracking branch 'Matthias-Fauconneau/master' into devel - - Conflicts: - src/libmv/tracking/CMakeLists.txt - -commit b9aac30a9ca6bc8362c09a0e191040964f7c6de2 -Merge: 198894e 6969e1a -Author: Keir Mierle -Date: Sat Nov 5 17:38:30 2011 -0700 - - Merge pull request #3 from nathanwiegand/master - - Just a few tiny cleanups - -commit 6969e1a9534291a982749baa5a3672c97bfa506d -Author: Nathan Wiegand -Date: Sat Nov 5 14:26:54 2011 -0700 - - I've added cleaned up a few style issues here an there. Also, I've updated the CMakeLists.txt file so that it can build the image_io library. Note, it's only been tested on OSX 10.6 - -commit 4763f851299050140757bfaa069107a0cf639e56 -Author: Nathan Wiegand -Date: Fri Nov 4 23:59:08 2011 -0700 - - Removed a superfulous comment - -commit a44577c0162e273681e4a9a3cc5f5b37d4315b67 -Author: Nathan Wiegand -Date: Fri Nov 4 23:55:52 2011 -0700 - - Removed a duplicate entry for an author. - -commit 198894e4c4f51c2c1784ad7c02eb45d2d1ada9bc -Merge: c4c67db 6e797d6 -Author: Keir Mierle -Date: Fri Nov 4 21:47:05 2011 -0700 - - Merge pull request #2 from nathanwiegand/master - - CMake changes for OSX - -commit 6e797d678c4c19f6a9e21657d66183f412cc995b -Author: Nathan Wiegand -Date: Fri Nov 4 21:43:28 2011 -0700 - - Uncomment the GUI part of the CMake file - -commit 33ef88a33860345d8906f3c9dd22d8dbce3df53e -Author: Nathan Wiegand -Date: Fri Nov 4 21:31:22 2011 -0700 - - Fixed build error on OSX by adding 'glog' to the dependencies in the tracker CMake - -commit 531c79bf95fddaaa70707d1abcd4fdafda16bbf0 -Author: Matthias Fauconneau -Date: Sat Aug 20 00:00:42 2011 +0200 - - Display warped pattern in marker preview. - -commit bb5c27e671b6f8eb56ddf490f0795d59bede591b -Author: Matthias Fauconneau -Date: Fri Aug 19 18:37:48 2011 +0200 - - Fix CMake build. diff --git a/extern/libmv/bundle.sh b/extern/libmv/bundle.sh index 1e386ec8096..23e90fc8f7d 100755 --- a/extern/libmv/bundle.sh +++ b/extern/libmv/bundle.sh @@ -136,19 +136,6 @@ set(INC_SYS \${ZLIB_INCLUDE_DIRS} ) - -# XXX - FIXME -# this is a momentary hack to find unwind.h in 10.6.sdk -if(APPLE) - if(\${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.6") - list(APPEND INC_SYS - \${CMAKE_OSX_SYSROOT}/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/include - ) - endif() -endif() -# XXX - END - - set(SRC libmv-capi.cpp ${sources} diff --git a/extern/libmv/files.txt b/extern/libmv/files.txt index 85d09ce05b8..22c5226adbe 100644 --- a/extern/libmv/files.txt +++ b/extern/libmv/files.txt @@ -17,6 +17,9 @@ libmv/multiview/euclidean_resection.cc libmv/multiview/euclidean_resection.h libmv/multiview/fundamental.cc libmv/multiview/fundamental.h +libmv/multiview/homography.cc +libmv/multiview/homography.h +libmv/multiview/homography_parameterization.h libmv/multiview/nviewtriangulation.h libmv/multiview/projection.cc libmv/multiview/projection.h @@ -69,6 +72,8 @@ libmv/tracking/pyramid_region_tracker.h libmv/tracking/region_tracker.h libmv/tracking/retrack_region_tracker.cc libmv/tracking/retrack_region_tracker.h +libmv/tracking/track_region.cc +libmv/tracking/track_region.h libmv/tracking/trklt_region_tracker.cc libmv/tracking/trklt_region_tracker.h third_party/fast/fast_10.c diff --git a/extern/libmv/libmv/multiview/fundamental.cc b/extern/libmv/libmv/multiview/fundamental.cc index 80f155e804d..12a611c748f 100644 --- a/extern/libmv/libmv/multiview/fundamental.cc +++ b/extern/libmv/libmv/multiview/fundamental.cc @@ -254,8 +254,8 @@ double SymmetricEpipolarDistance(const Mat &F, const Vec2 &x1, const Vec2 &x2) { Vec3 Ft_y = F.transpose() * y; double y_F_x = y.dot(F_x); - return Square(y_F_x) * ( 1 / F_x.head<2>().squaredNorm() - + 1 / Ft_y.head<2>().squaredNorm()); + return y_F_x * ( 1 / F_x.head<2>().norm() + + 1 / Ft_y.head<2>().norm()); } // HZ 9.6 pag 257 (formula 9.12) diff --git a/extern/libmv/libmv/simple_pipeline/initialize_reconstruction.cc b/extern/libmv/libmv/simple_pipeline/initialize_reconstruction.cc index 9c06d1ef4e6..84d143b77d6 100644 --- a/extern/libmv/libmv/simple_pipeline/initialize_reconstruction.cc +++ b/extern/libmv/libmv/simple_pipeline/initialize_reconstruction.cc @@ -31,22 +31,6 @@ namespace libmv { namespace { -void CoordinatesForMarkersInImage(const vector &markers, - int image, - Mat *coordinates) { - vector coords; - for (int i = 0; i < markers.size(); ++i) { - const Marker &marker = markers[i]; - if (markers[i].image == image) { - coords.push_back(Vec2(marker.x, marker.y)); - } - } - coordinates->resize(2, coords.size()); - for (int i = 0; i < coords.size(); i++) { - coordinates->col(i) = coords[i]; - } -} - void GetImagesInMarkers(const vector &markers, int *image1, int *image2) { if (markers.size() < 2) { diff --git a/extern/libmv/libmv/simple_pipeline/tracks.cc b/extern/libmv/libmv/simple_pipeline/tracks.cc index 3fb8ddbe513..620f6fc880a 100644 --- a/extern/libmv/libmv/simple_pipeline/tracks.cc +++ b/extern/libmv/libmv/simple_pipeline/tracks.cc @@ -72,6 +72,16 @@ vector Tracks::MarkersForTrack(int track) const { return markers; } +vector Tracks::MarkersInBothImages(int image1, int image2) const { + vector markers; + for (int i = 0; i < markers_.size(); ++i) { + int image = markers_[i].image; + if (image == image1 || image == image2) + markers.push_back(markers_[i]); + } + return markers; +} + vector Tracks::MarkersForTracksInBothImages(int image1, int image2) const { std::vector image1_tracks; std::vector image2_tracks; @@ -156,4 +166,20 @@ int Tracks::NumMarkers() const { return markers_.size(); } +void CoordinatesForMarkersInImage(const vector &markers, + int image, + Mat *coordinates) { + vector coords; + for (int i = 0; i < markers.size(); ++i) { + const Marker &marker = markers[i]; + if (markers[i].image == image) { + coords.push_back(Vec2(marker.x, marker.y)); + } + } + coordinates->resize(2, coords.size()); + for (int i = 0; i < coords.size(); i++) { + coordinates->col(i) = coords[i]; + } +} + } // namespace libmv diff --git a/extern/libmv/libmv/simple_pipeline/tracks.h b/extern/libmv/libmv/simple_pipeline/tracks.h index aa0fbaa6e4c..f9af3ada45b 100644 --- a/extern/libmv/libmv/simple_pipeline/tracks.h +++ b/extern/libmv/libmv/simple_pipeline/tracks.h @@ -22,6 +22,7 @@ #define LIBMV_SIMPLE_PIPELINE_TRACKS_H_ #include "libmv/base/vector.h" +#include "libmv/numeric/numeric.h" namespace libmv { @@ -84,6 +85,9 @@ class Tracks { /// Returns all the markers visible in \a image. vector MarkersInImage(int image) const; + /// Returns all the markers visible in \a image1 and \a image2. + vector MarkersInBothImages(int image1, int image2) const; + /*! Returns the markers in \a image1 and \a image2 which have a common track. @@ -114,6 +118,10 @@ class Tracks { vector markers_; }; +void CoordinatesForMarkersInImage(const vector &markers, + int image, + Mat *coordinates); + } // namespace libmv #endif // LIBMV_SIMPLE_PIPELINE_MARKERS_H_ diff --git a/extern/libmv/third_party/gflags/README.libmv b/extern/libmv/third_party/gflags/README.libmv index 673099ce618..b310c57ac34 100644 --- a/extern/libmv/third_party/gflags/README.libmv +++ b/extern/libmv/third_party/gflags/README.libmv @@ -11,4 +11,6 @@ Local modifications: - Added a poor-man's version of upstream's port.cc/h to make gflags compile on windows. This isn't sufficient but is a stopgap for now. +- Added -fPIC flag, so shared libraries from Ceres could be linked against static glog + TODO(keir): Import and use gflags for Windows from upstream. diff --git a/extern/libmv/third_party/glog/README.libmv b/extern/libmv/third_party/glog/README.libmv index 025a70b76a5..345bc9f5969 100644 --- a/extern/libmv/third_party/glog/README.libmv +++ b/extern/libmv/third_party/glog/README.libmv @@ -22,3 +22,4 @@ Upgrading Notes * Do not define va_copy for MinGW platforms (it's already defined there). * Patch localtime_r to be working fine with MinGW, disable strerror_r for MinGW because of lack of needed functions. +* Added -fPIC flag, so shared libraries from Ceres could be linked against static glog diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 12829f15aed..3242acf3edd 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -68,7 +68,7 @@ if(WITH_CYCLES_BLENDER) add_subdirectory(blender) endif() -if(WITH_CYCLES_TEST) +if(WITH_CYCLES_TEST OR WITH_CYCLES_NETWORK) add_subdirectory(app) endif() diff --git a/intern/cycles/app/cycles_server.cpp b/intern/cycles/app/cycles_server.cpp index e6a13e04b48..f94a29b9451 100644 --- a/intern/cycles/app/cycles_server.cpp +++ b/intern/cycles/app/cycles_server.cpp @@ -23,7 +23,9 @@ #include "util_args.h" #include "util_foreach.h" #include "util_path.h" +#include "util_stats.h" #include "util_string.h" +#include "util_task.h" using namespace ccl; @@ -32,29 +34,29 @@ int main(int argc, const char **argv) path_init(); /* device types */ - string devices = ""; + string devicelist = ""; string devicename = "cpu"; bool list = false; vector& types = Device::available_types(); foreach(DeviceType type, types) { - if(devices != "") - devices += ", "; + if(devicelist != "") + devicelist += ", "; - devices += Device::string_from_type(type); + devicelist += Device::string_from_type(type); } /* parse options */ ArgParse ap; ap.options ("Usage: cycles_server [options]", - "--device %s", &devicename, ("Devices to use: " + devices).c_str(), + "--device %s", &devicename, ("Devices to use: " + devicelist).c_str(), "--list-devices", &list, "List information about all available devices", NULL); if(ap.parse(argc, argv) < 0) { - fprintf(stderr, "%s\n", ap.error_message().c_str()); + fprintf(stderr, "%s\n", ap.geterror().c_str()); ap.usage(); exit(EXIT_FAILURE); } @@ -84,13 +86,18 @@ int main(int argc, const char **argv) } } + TaskScheduler::init(); + while(1) { - Device *device = Device::create(device_info); - printf("Cycles Server with device: %s\n", device->description().c_str()); + Stats stats; + Device *device = Device::create(device_info, stats); + printf("Cycles Server with device: %s\n", device->info.description.c_str()); device->server_run(); delete device; } + TaskScheduler::exit(); + return 0; } diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index e78026e7ae1..d455bdbe8e2 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -331,7 +331,13 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine b_engine, BL::Use /* device default CPU */ params.device = devices[0]; - if(RNA_enum_get(&cscene, "device") != 0) { + if(RNA_enum_get(&cscene, "device") == 2) { + /* find network device */ + foreach(DeviceInfo& info, devices) + if(info.type == DEVICE_NETWORK) + params.device = info; + } + else if(RNA_enum_get(&cscene, "device") == 1) { /* find GPU device with given id */ PointerRNA systemptr = b_userpref.system().ptr; PropertyRNA *deviceprop = RNA_struct_find_property(&systemptr, "compute_device"); diff --git a/intern/cycles/device/device_network.cpp b/intern/cycles/device/device_network.cpp index a5e0d39df73..f5545c3dfdf 100644 --- a/intern/cycles/device/device_network.cpp +++ b/intern/cycles/device/device_network.cpp @@ -31,6 +31,8 @@ class NetworkDevice : public Device public: boost::asio::io_service io_service; tcp::socket socket; + device_ptr mem_counter; + DeviceTask the_task; /* todo: handle multiple tasks */ NetworkDevice(Stats &stats, const char *address) : Device(stats), socket(io_service) @@ -49,75 +51,72 @@ public: socket.close(); socket.connect(*endpoint_iterator++, error); } + if(error) throw boost::system::system_error(error); + + mem_counter = 0; } ~NetworkDevice() { + RPCSend snd(socket, "stop"); + snd.write(); } void mem_alloc(device_memory& mem, MemoryType type) { -#if 0 + mem.device_pointer = ++mem_counter; + RPCSend snd(socket, "mem_alloc"); - snd.archive & size & type; + snd.add(mem); + snd.add(type); snd.write(); - - RPCReceive rcv(socket); - - device_ptr mem; - *rcv.archive & mem; - - return mem; -#endif } void mem_copy_to(device_memory& mem) { -#if 0 RPCSend snd(socket, "mem_copy_to"); - snd.archive & mem & size; + snd.add(mem); snd.write(); - snd.write_buffer(host, size); -#endif + snd.write_buffer((void*)mem.data_pointer, mem.memory_size()); } void mem_copy_from(device_memory& mem, int y, int w, int h, int elem) { -#if 0 RPCSend snd(socket, "mem_copy_from"); - snd.archive & mem & offset & size; + snd.add(mem); + snd.add(y); + snd.add(w); + snd.add(h); + snd.add(elem); snd.write(); RPCReceive rcv(socket); - rcv.read_buffer(host, size); -#endif + rcv.read_buffer((void*)mem.data_pointer, mem.memory_size()); } void mem_zero(device_memory& mem) { -#if 0 RPCSend snd(socket, "mem_zero"); - snd.archive & mem & size; + snd.add(mem); snd.write(); -#endif } void mem_free(device_memory& mem) { -#if 0 - if(mem) { + if(mem.device_pointer) { RPCSend snd(socket, "mem_free"); - snd.archive & mem; + snd.add(mem); snd.write(); + + mem.device_pointer = 0; } -#endif } void const_copy_to(const char *name, void *host, size_t size) @@ -126,79 +125,107 @@ public: string name_string(name); - snd.archive & name_string & size; + snd.add(name_string); + snd.add(size); snd.write(); snd.write_buffer(host, size); } void tex_alloc(const char *name, device_memory& mem, bool interpolation, bool periodic) { -#if 0 + mem.device_pointer = ++mem_counter; + RPCSend snd(socket, "tex_alloc"); string name_string(name); - snd.archive & name_string & width & height & datatype & components & interpolation; + snd.add(name_string); + snd.add(mem); + snd.add(interpolation); + snd.add(periodic); snd.write(); - - size_t size = width*height*components*datatype_size(datatype); - snd.write_buffer(host, size); - - RPCReceive rcv(socket); - - device_ptr mem; - *rcv.archive & mem; - - return mem; -#endif + snd.write_buffer((void*)mem.data_pointer, mem.memory_size()); } void tex_free(device_memory& mem) { -#if 0 - if(mem) { + if(mem.device_pointer) { RPCSend snd(socket, "tex_free"); - snd.archive & mem; + snd.add(mem); snd.write(); + + mem.device_pointer = 0; } -#endif - } - - void path_trace(int x, int y, int w, int h, device_ptr buffer, device_ptr rng_state, int sample) - { -#if 0 - RPCSend snd(socket, "path_trace"); - - snd.archive & x & y & w & h & buffer & rng_state & sample; - snd.write(); -#endif - } - - void tonemap(int x, int y, int w, int h, device_ptr rgba, device_ptr buffer, int sample, int resolution) - { -#if 0 - RPCSend snd(socket, "tonemap"); - - snd.archive & x & y & w & h & rgba & buffer & sample & resolution; - snd.write(); -#endif } void task_add(DeviceTask& task) { - if(task.type == DeviceTask::TONEMAP) - tonemap(task.x, task.y, task.w, task.h, task.rgba, task.buffer, task.sample, task.resolution); - else if(task.type == DeviceTask::PATH_TRACE) - path_trace(task.x, task.y, task.w, task.h, task.buffer, task.rng_state, task.sample); + the_task = task; + + RPCSend snd(socket, "task_add"); + snd.add(task); + snd.write(); } void task_wait() { + RPCSend snd(socket, "task_wait"); + snd.write(); + + list the_tiles; + + /* todo: run this threaded for connecting to multiple clients */ + for(;;) { + RPCReceive rcv(socket); + RenderTile tile; + + if(rcv.name == "acquire_tile") { + /* todo: watch out for recursive calls! */ + if(the_task.acquire_tile(this, tile)) { /* write return as bool */ + the_tiles.push_back(tile); + + RPCSend snd(socket, "acquire_tile"); + snd.add(tile); + snd.write(); + } + else { + RPCSend snd(socket, "acquire_tile_none"); + snd.write(); + } + } + else if(rcv.name == "release_tile") { + rcv.read(tile); + + for(list::iterator it = the_tiles.begin(); it != the_tiles.end(); it++) { + if(tile.x == it->x && tile.y == it->y && tile.start_sample == it->start_sample) { + tile.buffers = it->buffers; + the_tiles.erase(it); + break; + } + } + + assert(tile.buffers != NULL); + + the_task.release_tile(tile); + + RPCSend snd(socket, "release_tile"); + snd.write(); + } + else if(rcv.name == "task_wait_done") + break; + } } void task_cancel() { + RPCSend snd(socket, "task_cancel"); + snd.write(); + } + + bool support_advanced_shading() + { + return true; /* todo: get this info from device */ } }; @@ -219,16 +246,285 @@ void device_network_info(vector& devices) devices.push_back(info); } +class DeviceServer { +public: + DeviceServer(Device *device_, tcp::socket& socket_) + : device(device_), socket(socket_) + { + } + + void listen() + { + /* receive remote function calls */ + for(;;) { + RPCReceive rcv(socket); + + if(rcv.name == "stop") + break; + + process(rcv); + } + } + +protected: + void process(RPCReceive& rcv) + { + // fprintf(stderr, "receive process %s\n", rcv.name.c_str()); + + if(rcv.name == "mem_alloc") { + MemoryType type; + network_device_memory mem; + device_ptr remote_pointer; + + rcv.read(mem); + rcv.read(type); + + /* todo: CPU needs mem.data_pointer */ + + remote_pointer = mem.device_pointer; + + mem_data[remote_pointer] = vector(); + mem_data[remote_pointer].resize(mem.memory_size()); + if(mem.memory_size()) + mem.data_pointer = (device_ptr)&(mem_data[remote_pointer][0]); + else + mem.data_pointer = 0; + + device->mem_alloc(mem, type); + + ptr_map[remote_pointer] = mem.device_pointer; + ptr_imap[mem.device_pointer] = remote_pointer; + } + else if(rcv.name == "mem_copy_to") { + network_device_memory mem; + + rcv.read(mem); + + device_ptr remote_pointer = mem.device_pointer; + mem.data_pointer = (device_ptr)&(mem_data[remote_pointer][0]); + + rcv.read_buffer((uint8_t*)mem.data_pointer, mem.memory_size()); + + mem.device_pointer = ptr_map[remote_pointer]; + + device->mem_copy_to(mem); + } + else if(rcv.name == "mem_copy_from") { + network_device_memory mem; + int y, w, h, elem; + + rcv.read(mem); + rcv.read(y); + rcv.read(w); + rcv.read(h); + rcv.read(elem); + + device_ptr remote_pointer = mem.device_pointer; + mem.device_pointer = ptr_map[remote_pointer]; + mem.data_pointer = (device_ptr)&(mem_data[remote_pointer][0]); + + device->mem_copy_from(mem, y, w, h, elem); + + RPCSend snd(socket); + snd.write(); + snd.write_buffer((uint8_t*)mem.data_pointer, mem.memory_size()); + } + else if(rcv.name == "mem_zero") { + network_device_memory mem; + + rcv.read(mem); + device_ptr remote_pointer = mem.device_pointer; + mem.device_pointer = ptr_map[mem.device_pointer]; + mem.data_pointer = (device_ptr)&(mem_data[remote_pointer][0]); + + device->mem_zero(mem); + } + else if(rcv.name == "mem_free") { + network_device_memory mem; + device_ptr remote_pointer; + + rcv.read(mem); + + remote_pointer = mem.device_pointer; + mem.device_pointer = ptr_map[mem.device_pointer]; + ptr_map.erase(remote_pointer); + ptr_imap.erase(mem.device_pointer); + mem_data.erase(remote_pointer); + + device->mem_free(mem); + } + else if(rcv.name == "const_copy_to") { + string name_string; + size_t size; + + rcv.read(name_string); + rcv.read(size); + + vector host_vector(size); + rcv.read_buffer(&host_vector[0], size); + + device->const_copy_to(name_string.c_str(), &host_vector[0], size); + } + else if(rcv.name == "tex_alloc") { + network_device_memory mem; + string name; + bool interpolation; + bool periodic; + device_ptr remote_pointer; + + rcv.read(name); + rcv.read(mem); + rcv.read(interpolation); + rcv.read(periodic); + + remote_pointer = mem.device_pointer; + + mem_data[remote_pointer] = vector(); + mem_data[remote_pointer].resize(mem.memory_size()); + if(mem.memory_size()) + mem.data_pointer = (device_ptr)&(mem_data[remote_pointer][0]); + else + mem.data_pointer = 0; + + rcv.read_buffer((uint8_t*)mem.data_pointer, mem.memory_size()); + + device->tex_alloc(name.c_str(), mem, interpolation, periodic); + + ptr_map[remote_pointer] = mem.device_pointer; + ptr_imap[mem.device_pointer] = remote_pointer; + } + else if(rcv.name == "tex_free") { + network_device_memory mem; + device_ptr remote_pointer; + + rcv.read(mem); + + remote_pointer = mem.device_pointer; + mem.device_pointer = ptr_map[mem.device_pointer]; + ptr_map.erase(remote_pointer); + ptr_map.erase(mem.device_pointer); + mem_data.erase(remote_pointer); + + device->tex_free(mem); + } + else if(rcv.name == "task_add") { + DeviceTask task; + + rcv.read(task); + + if(task.buffer) task.buffer = ptr_map[task.buffer]; + if(task.rgba) task.rgba = ptr_map[task.rgba]; + if(task.shader_input) task.shader_input = ptr_map[task.shader_input]; + if(task.shader_output) task.shader_output = ptr_map[task.shader_output]; + + task.acquire_tile = function_bind(&DeviceServer::task_acquire_tile, this, _1, _2); + task.release_tile = function_bind(&DeviceServer::task_release_tile, this, _1); + task.update_progress_sample = function_bind(&DeviceServer::task_update_progress_sample, this); + task.update_tile_sample = function_bind(&DeviceServer::task_update_tile_sample, this, _1); + task.get_cancel = function_bind(&DeviceServer::task_get_cancel, this); + + device->task_add(task); + } + else if(rcv.name == "task_wait") { + device->task_wait(); + + RPCSend snd(socket, "task_wait_done"); + snd.write(); + } + else if(rcv.name == "task_cancel") { + device->task_cancel(); + } + } + + bool task_acquire_tile(Device *device, RenderTile& tile) + { + thread_scoped_lock acquire_lock(acquire_mutex); + + bool result = false; + + RPCSend snd(socket, "acquire_tile"); + snd.write(); + + while(1) { + RPCReceive rcv(socket); + + if(rcv.name == "acquire_tile") { + rcv.read(tile); + + if(tile.buffer) tile.buffer = ptr_map[tile.buffer]; + if(tile.rng_state) tile.rng_state = ptr_map[tile.rng_state]; + if(tile.rgba) tile.rgba = ptr_map[tile.rgba]; + + result = true; + break; + } + else if(rcv.name == "acquire_tile_none") + break; + else + process(rcv); + } + + return result; + } + + void task_update_progress_sample() + { + ; /* skip */ + } + + void task_update_tile_sample(RenderTile&) + { + ; /* skip */ + } + + void task_release_tile(RenderTile& tile) + { + thread_scoped_lock acquire_lock(acquire_mutex); + + if(tile.buffer) tile.buffer = ptr_imap[tile.buffer]; + if(tile.rng_state) tile.rng_state = ptr_imap[tile.rng_state]; + if(tile.rgba) tile.rgba = ptr_imap[tile.rgba]; + + RPCSend snd(socket, "release_tile"); + snd.add(tile); + snd.write(); + + while(1) { + RPCReceive rcv(socket); + + if(rcv.name == "release_tile") + break; + else + process(rcv); + } + } + + bool task_get_cancel() + { + return false; + } + + /* properties */ + Device *device; + tcp::socket& socket; + + /* mapping of remote to local pointer */ + map ptr_map; + map ptr_imap; + map > mem_data; + + thread_mutex acquire_mutex; + + /* todo: free memory and device (osl) on network error */ +}; + void Device::server_run() { - try - { + try { /* starts thread that responds to discovery requests */ ServerDiscovery discovery; - for(;;) - { - + for(;;) { /* accept connection */ boost::asio::io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), SERVER_PORT)); @@ -236,145 +532,17 @@ void Device::server_run() tcp::socket socket(io_service); acceptor.accept(socket); - /* receive remote function calls */ - for(;;) { - RPCReceive rcv(socket); + string remote_address = socket.remote_endpoint().address().to_string(); + printf("Connected to remote client at: %s\n", remote_address.c_str()); - if(rcv.name == "description") { - string desc = description(); + DeviceServer server(this, socket); + server.listen(); - RPCSend snd(socket); - snd.archive & desc; - snd.write(); - } - else if(rcv.name == "mem_alloc") { -#if 0 - MemoryType type; - size_t size; - device_ptr mem; - - *rcv.archive & size & type; - mem = mem_alloc(size, type); - - RPCSend snd(socket); - snd.archive & mem; - snd.write(); -#endif - } - else if(rcv.name == "mem_copy_to") { -#if 0 - device_ptr mem; - size_t size; - - *rcv.archive & mem & size; - - vector host_vector(size); - rcv.read_buffer(&host_vector[0], size); - - mem_copy_to(mem, &host_vector[0], size); -#endif - } - else if(rcv.name == "mem_copy_from") { -#if 0 - device_ptr mem; - size_t offset, size; - - *rcv.archive & mem & offset & size; - - vector host_vector(size); - - mem_copy_from(&host_vector[0], mem, offset, size); - - RPCSend snd(socket); - snd.write(); - snd.write_buffer(&host_vector[0], size); -#endif - } - else if(rcv.name == "mem_zero") { -#if 0 - device_ptr mem; - size_t size; - - *rcv.archive & mem & size; - mem_zero(mem, size); -#endif - } - else if(rcv.name == "mem_free") { -#if 0 - device_ptr mem; - - *rcv.archive & mem; - mem_free(mem); -#endif - } - else if(rcv.name == "const_copy_to") { - string name_string; - size_t size; - - *rcv.archive & name_string & size; - - vector host_vector(size); - rcv.read_buffer(&host_vector[0], size); - - const_copy_to(name_string.c_str(), &host_vector[0], size); - } - else if(rcv.name == "tex_alloc") { -#if 0 - string name_string; - DataType datatype; - device_ptr mem; - size_t width, height; - int components; - bool interpolation; - - *rcv.archive & name_string & width & height & datatype & components & interpolation; - - size_t size = width*height*components*datatype_size(datatype); - - vector host_vector(size); - rcv.read_buffer(&host_vector[0], size); - - mem = tex_alloc(name_string.c_str(), &host_vector[0], width, height, datatype, components, interpolation); - - RPCSend snd(socket); - snd.archive & mem; - snd.write(); -#endif - } - else if(rcv.name == "tex_free") { -#if 0 - device_ptr mem; - - *rcv.archive & mem; - tex_free(mem); -#endif - } - else if(rcv.name == "path_trace") { -#if 0 - device_ptr buffer, rng_state; - int x, y, w, h; - int sample; - - *rcv.archive & x & y & w & h & buffer & rng_state & sample; - path_trace(x, y, w, h, buffer, rng_state, sample); -#endif - } - else if(rcv.name == "tonemap") { -#if 0 - device_ptr rgba, buffer; - int x, y, w, h; - int sample, resolution; - - *rcv.archive & x & y & w & h & rgba & buffer & sample & resolution; - tonemap(x, y, w, h, rgba, buffer, sample, resolution); -#endif - } - } + printf("Disconnected.\n"); } } - catch(exception& e) - { - cerr << "Network server exception: " << e.what() << endl; + catch(exception& e) { + fprintf(stderr, "Network server exception: %s\n", e.what()); } } diff --git a/intern/cycles/device/device_network.h b/intern/cycles/device/device_network.h index e3afe46d2b0..b74329888d3 100644 --- a/intern/cycles/device/device_network.h +++ b/intern/cycles/device/device_network.h @@ -31,15 +31,17 @@ #include +#include "buffers.h" + #include "util_foreach.h" #include "util_list.h" +#include "util_map.h" #include "util_string.h" CCL_NAMESPACE_BEGIN using std::cout; using std::cerr; -using std::endl; using std::hex; using std::setw; using std::exception; @@ -51,13 +53,63 @@ static const int DISCOVER_PORT = 5121; static const string DISCOVER_REQUEST_MSG = "REQUEST_RENDER_SERVER_IP"; static const string DISCOVER_REPLY_MSG = "REPLY_RENDER_SERVER_IP"; -typedef struct RPCSend { +/* Serialization of device memory */ + +class network_device_memory : public device_memory +{ +public: + network_device_memory() {} + ~network_device_memory() { device_pointer = 0; }; + + vector local_data; +}; + +/* Remote procedure call Send */ + +class RPCSend { +public: RPCSend(tcp::socket& socket_, const string& name_ = "") - : name(name_), socket(socket_), archive(archive_stream) + : name(name_), socket(socket_), archive(archive_stream), sent(false) { archive & name_; } + ~RPCSend() + { + if(!sent) + fprintf(stderr, "Error: RPC %s not sent\n", name.c_str()); + } + + void add(const device_memory& mem) + { + archive & mem.data_type & mem.data_elements & mem.data_size; + archive & mem.data_width & mem.data_height & mem.device_pointer; + } + + template void add(const T& data) + { + archive & data; + } + + void add(const DeviceTask& task) + { + int type = (int)task.type; + + archive & type & task.x & task.y & task.w & task.h; + archive & task.rgba & task.buffer & task.sample & task.num_samples; + archive & task.resolution & task.offset & task.stride; + archive & task.shader_input & task.shader_output & task.shader_eval_type; + archive & task.shader_x & task.shader_w; + } + + void add(const RenderTile& tile) + { + archive & tile.x & tile.y & tile.w & tile.h; + archive & tile.start_sample & tile.num_samples & tile.sample; + archive & tile.resolution & tile.offset & tile.stride; + archive & tile.buffer & tile.rng_state & tile.rgba; + } + void write() { boost::system::error_code error; @@ -84,6 +136,8 @@ typedef struct RPCSend { if(error.value()) cout << "Network send error: " << error.message() << "\n"; + + sent = true; } void write_buffer(void *buffer, size_t size) @@ -98,13 +152,18 @@ typedef struct RPCSend { cout << "Network send error: " << error.message() << "\n"; } +protected: string name; tcp::socket& socket; ostringstream archive_stream; boost::archive::text_oarchive archive; -} RPCSend; + bool sent; +}; -typedef struct RPCReceive { +/* Remote procedure call Receive */ + +class RPCReceive { +public: RPCReceive(tcp::socket& socket_) : socket(socket_), archive_stream(NULL), archive(NULL) { @@ -151,6 +210,19 @@ typedef struct RPCReceive { delete archive_stream; } + void read(network_device_memory& mem) + { + *archive & mem.data_type & mem.data_elements & mem.data_size; + *archive & mem.data_width & mem.data_height & mem.device_pointer; + + mem.data_pointer = 0; + } + + template void read(T& data) + { + *archive & data; + } + void read_buffer(void *buffer, size_t size) { size_t len = boost::asio::read(socket, boost::asio::buffer(buffer, size)); @@ -159,12 +231,39 @@ typedef struct RPCReceive { cout << "Network receive error: buffer size doesn't match expected size\n"; } + void read(DeviceTask& task) + { + int type; + + *archive & type & task.x & task.y & task.w & task.h; + *archive & task.rgba & task.buffer & task.sample & task.num_samples; + *archive & task.resolution & task.offset & task.stride; + *archive & task.shader_input & task.shader_output & task.shader_eval_type; + *archive & task.shader_x & task.shader_w; + + task.type = (DeviceTask::Type)type; + } + + void read(RenderTile& tile) + { + *archive & tile.x & tile.y & tile.w & tile.h; + *archive & tile.start_sample & tile.num_samples & tile.sample; + *archive & tile.resolution & tile.offset & tile.stride; + *archive & tile.buffer & tile.rng_state & tile.rgba; + + tile.buffers = NULL; + } + string name; + +protected: tcp::socket& socket; string archive_str; istringstream *archive_stream; boost::archive::text_iarchive *archive; -} RPCReceive; +}; + +/* Server auto discovery */ class ServerDiscovery { public: diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index b6e024dde17..fde881c0a06 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -55,6 +55,7 @@ set(SRC_CLOSURE_HEADERS closure/bsdf_phong_ramp.h closure/bsdf_reflection.h closure/bsdf_refraction.h + closure/bsdf_toon.h closure/bsdf_transparent.h closure/bsdf_util.h closure/bsdf_ward.h diff --git a/intern/cycles/kernel/closure/bsdf_toon.h b/intern/cycles/kernel/closure/bsdf_toon.h new file mode 100644 index 00000000000..40001bf7531 --- /dev/null +++ b/intern/cycles/kernel/closure/bsdf_toon.h @@ -0,0 +1,206 @@ +/* + * Adapted from Open Shading Language with this license: + * + * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al. + * All Rights Reserved. + * + * Modifications Copyright 2011, Blender Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Sony Pictures Imageworks nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * 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 __BSDF_TOON_H__ +#define __BSDF_TOON_H__ + +CCL_NAMESPACE_BEGIN + +/* DIFFUSE TOON */ + +__device int bsdf_diffuse_toon_setup(ShaderClosure *sc) +{ + sc->type = CLOSURE_BSDF_DIFFUSE_TOON_ID; + sc->data0 = clamp(sc->data0, 0.0f, 1.0f); + sc->data1 = clamp(sc->data1, 0.0f, 1.0f); + + return SD_BSDF|SD_BSDF_HAS_EVAL; +} + +__device void bsdf_diffuse_toon_blur(ShaderClosure *sc, float roughness) +{ +} + +__device float3 bsdf_toon_get_intensity(float max_angle, float smooth, float angle) +{ + float is; + + if(angle < max_angle) + is = 1.0f; + else if(angle < (max_angle + smooth) && smooth != 0.0f) + is = (1.0f - (angle - max_angle)/smooth); + else + is = 0.0f; + + return make_float3(is, is, is); +} + +__device float bsdf_toon_get_sample_angle(float max_angle, float smooth) +{ + return fminf(max_angle + smooth, M_PI_2_F); +} + +__device float3 bsdf_diffuse_toon_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +{ + float max_angle = sc->data0*M_PI_2_F; + float smooth = sc->data1*M_PI_2_F; + float angle = safe_acosf(fmaxf(dot(sc->N, omega_in), 0.0f)); + + float3 eval = bsdf_toon_get_intensity(max_angle, smooth, angle); + + if(eval.x > 0.0f) { + float sample_angle = bsdf_toon_get_sample_angle(max_angle, smooth); + + *pdf = 0.5f * M_1_PI_F / (1.0f - cosf(sample_angle)); + return *pdf * eval; + } + + return make_float3(0.0f, 0.0f, 0.0f); +} + +__device float3 bsdf_diffuse_toon_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +{ + return make_float3(0.0f, 0.0f, 0.0f); +} + +__device int bsdf_diffuse_toon_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf) +{ + float max_angle = sc->data0*M_PI_2_F; + float smooth = sc->data1*M_PI_2_F; + float sample_angle = bsdf_toon_get_sample_angle(max_angle, smooth); + float angle = sample_angle*randu; + + if(sample_angle > 0.0f) { + sample_uniform_cone(sc->N, sample_angle, randu, randv, omega_in, pdf); + + if(dot(Ng, *omega_in) > 0.0f) { + *eval = *pdf * bsdf_toon_get_intensity(max_angle, smooth, angle); + +#ifdef __RAY_DIFFERENTIALS__ + // TODO: find a better approximation for the bounce + *domega_in_dx = (2.0f * dot(sc->N, dIdx)) * sc->N - dIdx; + *domega_in_dy = (2.0f * dot(sc->N, dIdy)) * sc->N - dIdy; +#endif + } + else + *pdf = 0.0f; + } + + return LABEL_REFLECT | LABEL_DIFFUSE; + +} + +/* SPECULAR TOON */ + +__device int bsdf_specular_toon_setup(ShaderClosure *sc) +{ + sc->type = CLOSURE_BSDF_SPECULAR_TOON_ID; + sc->data0 = clamp(sc->data0, 0.0f, 1.0f); + sc->data1 = clamp(sc->data1, 0.0f, 1.0f); + + return SD_BSDF|SD_BSDF_HAS_EVAL; +} + +__device void bsdf_specular_toon_blur(ShaderClosure *sc, float roughness) +{ +} + +__device float3 bsdf_specular_toon_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +{ + float max_angle = sc->data0*M_PI_2_F; + float smooth = sc->data1*M_PI_2_F; + float cosNI = dot(sc->N, omega_in); + float cosNO = dot(sc->N, I); + + if(cosNI > 0 && cosNO > 0) { + /* reflect the view vector */ + float3 R = (2 * cosNO) * sc->N - I; + float cosRI = dot(R, omega_in); + + float angle = safe_acosf(fmaxf(cosRI, 0.0f)); + + float3 eval = bsdf_toon_get_intensity(max_angle, smooth, angle); + float sample_angle = bsdf_toon_get_sample_angle(max_angle, smooth); + + *pdf = 0.5f * M_1_PI_F / (1.0f - cosf(sample_angle)); + return *pdf * eval; + } + + return make_float3(0.0f, 0.0f, 0.0f); +} + +__device float3 bsdf_specular_toon_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +{ + return make_float3(0.0f, 0.0f, 0.0f); +} + +__device int bsdf_specular_toon_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf) +{ + float max_angle = sc->data0*M_PI_2_F; + float smooth = sc->data1*M_PI_2_F; + float cosNO = dot(sc->N, I); + + if(cosNO > 0) { + /* reflect the view vector */ + float3 R = (2 * cosNO) * sc->N - I; + + float sample_angle = bsdf_toon_get_sample_angle(max_angle, smooth); + float angle = sample_angle*randu; + + sample_uniform_cone(R, sample_angle, randu, randv, omega_in, pdf); + + if(dot(Ng, *omega_in) > 0.0f) { + float cosNI = dot(sc->N, *omega_in); + + /* make sure the direction we chose is still in the right hemisphere */ + if(cosNI > 0) { + *eval = *pdf * bsdf_toon_get_intensity(max_angle, smooth, angle); + +#ifdef __RAY_DIFFERENTIALS__ + *domega_in_dx = (2 * dot(sc->N, dIdx)) * sc->N - dIdx; + *domega_in_dy = (2 * dot(sc->N, dIdy)) * sc->N - dIdy; +#endif + } + else + *pdf = 0.0f; + } + else + *pdf = 0.0f; + } + + return LABEL_GLOSSY | LABEL_REFLECT; +} + +CCL_NAMESPACE_END + +#endif /* __BSDF_TOON_H__ */ + diff --git a/intern/cycles/kernel/kernel_compat_cuda.h b/intern/cycles/kernel/kernel_compat_cuda.h index 40bae069dea..9fd065c3cda 100644 --- a/intern/cycles/kernel/kernel_compat_cuda.h +++ b/intern/cycles/kernel/kernel_compat_cuda.h @@ -37,6 +37,7 @@ #define __global #define __shared __shared__ #define __constant +#define __may_alias /* No assert supported for CUDA */ diff --git a/intern/cycles/kernel/kernel_compat_opencl.h b/intern/cycles/kernel/kernel_compat_opencl.h index a9d18588cc8..abb2f094f5c 100644 --- a/intern/cycles/kernel/kernel_compat_opencl.h +++ b/intern/cycles/kernel/kernel_compat_opencl.h @@ -40,6 +40,7 @@ #define __device #define __device_inline __device #define __device_noinline __device __noinline +#define __may_alias /* no assert in opencl */ #define kernel_assert(cond) diff --git a/intern/cycles/kernel/kernel_montecarlo.h b/intern/cycles/kernel/kernel_montecarlo.h index 48d1aa64c9f..fb66501c336 100644 --- a/intern/cycles/kernel/kernel_montecarlo.h +++ b/intern/cycles/kernel/kernel_montecarlo.h @@ -105,6 +105,22 @@ __device_inline void sample_uniform_hemisphere(const float3 N, *pdf = 0.5f * M_1_PI_F; } +__device_inline void sample_uniform_cone(const float3 N, float angle, + float randu, float randv, + float3 *omega_in, float *pdf) +{ + float z = cosf(angle*randu); + float r = sqrtf(max(0.0f, 1.0f - z*z)); + float phi = 2.0f * M_PI_F * randv; + float x = r * cosf(phi); + float y = r * sinf(phi); + + float3 T, B; + make_orthonormals (N, &T, &B); + *omega_in = x * T + y * B + z * N; + *pdf = 0.5f * M_1_PI_F / (1.0f - cosf(angle)); +} + __device float3 sample_uniform_sphere(float u1, float u2) { float z = 1.0f - 2.0f*u1; diff --git a/intern/cycles/kernel/kernel_object.h b/intern/cycles/kernel/kernel_object.h index 2b38544e527..40aa4753daa 100644 --- a/intern/cycles/kernel/kernel_object.h +++ b/intern/cycles/kernel/kernel_object.h @@ -20,11 +20,16 @@ CCL_NAMESPACE_BEGIN enum ObjectTransform { OBJECT_TRANSFORM = 0, - OBJECT_INVERSE_TRANSFORM = 3, - OBJECT_PROPERTIES = 6, - OBJECT_TRANSFORM_MOTION_PRE = 8, - OBJECT_TRANSFORM_MOTION_POST = 12, - OBJECT_DUPLI = 16 + OBJECT_TRANSFORM_MOTION_PRE = 0, + OBJECT_INVERSE_TRANSFORM = 4, + OBJECT_TRANSFORM_MOTION_POST = 4, + OBJECT_PROPERTIES = 8, + OBJECT_DUPLI = 9 +}; + +enum ObjectVectorTransform { + OBJECT_VECTOR_MOTION_PRE = 0, + OBJECT_VECTOR_MOTION_POST = 3 }; __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, enum ObjectTransform type) @@ -40,6 +45,19 @@ __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, return tfm; } +__device_inline Transform object_fetch_vector_transform(KernelGlobals *kg, int object, enum ObjectVectorTransform type) +{ + int offset = object*OBJECT_VECTOR_SIZE + (int)type; + + Transform tfm; + tfm.x = kernel_tex_fetch(__objects_vector, offset + 0); + tfm.y = kernel_tex_fetch(__objects_vector, offset + 1); + tfm.z = kernel_tex_fetch(__objects_vector, offset + 2); + tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f); + + return tfm; +} + #ifdef __OBJECT_MOTION__ __device_inline Transform object_fetch_transform_motion(KernelGlobals *kg, int object, float time) { diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h index 4855a948c6e..29f6b3f072c 100644 --- a/intern/cycles/kernel/kernel_textures.h +++ b/intern/cycles/kernel/kernel_textures.h @@ -34,6 +34,7 @@ KERNEL_TEX(uint, texture_uint, __object_node) /* objects */ KERNEL_TEX(float4, texture_float4, __objects) +KERNEL_TEX(float4, texture_float4, __objects_vector) /* triangles */ KERNEL_TEX(float4, texture_float4, __tri_normal) diff --git a/intern/cycles/kernel/kernel_triangle.h b/intern/cycles/kernel/kernel_triangle.h index 0db447289c8..570ae52d6c2 100644 --- a/intern/cycles/kernel/kernel_triangle.h +++ b/intern/cycles/kernel/kernel_triangle.h @@ -209,10 +209,10 @@ __device float4 triangle_motion_vector(KernelGlobals *kg, ShaderData *sd) * transformation was set match the world/object space of motion_pre/post */ Transform tfm; - tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM_MOTION_PRE); + tfm = object_fetch_vector_transform(kg, sd->object, OBJECT_VECTOR_MOTION_PRE); motion_pre = transform_point(&tfm, motion_pre); - tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM_MOTION_POST); + tfm = object_fetch_vector_transform(kg, sd->object, OBJECT_VECTOR_MOTION_POST); motion_post = transform_point(&tfm, motion_post); float3 P; diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index a0673f55681..d11b96503d9 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -29,7 +29,8 @@ CCL_NAMESPACE_BEGIN /* constants */ -#define OBJECT_SIZE 18 +#define OBJECT_SIZE 11 +#define OBJECT_VECTOR_SIZE 6 #define LIGHT_SIZE 4 #define FILTER_TABLE_SIZE 256 #define RAMP_TABLE_SIZE 256 diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt index 80653f24338..5a27f7823e4 100644 --- a/intern/cycles/kernel/osl/CMakeLists.txt +++ b/intern/cycles/kernel/osl/CMakeLists.txt @@ -16,6 +16,7 @@ set(SRC background.cpp bsdf_diffuse_ramp.cpp bsdf_phong_ramp.cpp + bsdf_toon.cpp emissive.cpp osl_closures.cpp osl_services.cpp diff --git a/intern/cycles/kernel/osl/bsdf_toon.cpp b/intern/cycles/kernel/osl/bsdf_toon.cpp new file mode 100644 index 00000000000..d409b2cedaf --- /dev/null +++ b/intern/cycles/kernel/osl/bsdf_toon.cpp @@ -0,0 +1,179 @@ +/* + * Adapted from Open Shading Language with this license: + * + * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al. + * All Rights Reserved. + * + * Modifications Copyright 2011, Blender Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Sony Pictures Imageworks nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * 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 + +#include + +#include "osl_closures.h" + +#include "kernel_types.h" +#include "kernel_montecarlo.h" +#include "closure/bsdf_toon.h" + +CCL_NAMESPACE_BEGIN + +using namespace OSL; + +/* DIFFUSE TOON */ + +class DiffuseToonClosure : public CBSDFClosure { +public: + DiffuseToonClosure() : CBSDFClosure(LABEL_DIFFUSE) {} + + size_t memsize() const { return sizeof(*this); } + const char *name() const { return "diffuse_toon"; } + + void setup() + { + sc.prim = this; + m_shaderdata_flag = bsdf_diffuse_toon_setup(&sc); + } + + bool mergeable(const ClosurePrimitive *other) const + { + return false; + } + + void blur(float roughness) + { + bsdf_diffuse_toon_blur(&sc, roughness); + } + + void print_on(std::ostream &out) const + { + out << name() << " ((" << sc.N[0] << ", " << sc.N[1] << ", " << sc.N[2] << "))"; + } + + float3 eval_reflect(const float3 &omega_out, const float3 &omega_in, float& pdf) const + { + return bsdf_diffuse_toon_eval_reflect(&sc, omega_out, omega_in, &pdf); + } + + float3 eval_transmit(const float3 &omega_out, const float3 &omega_in, float& pdf) const + { + return bsdf_diffuse_toon_eval_transmit(&sc, omega_out, omega_in, &pdf); + } + + int sample(const float3 &Ng, + const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy, + float randu, float randv, + float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy, + float &pdf, float3 &eval) const + { + return bsdf_diffuse_toon_sample(&sc, Ng, omega_out, domega_out_dx, domega_out_dy, + randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf); + } +}; + +ClosureParam *closure_bsdf_diffuse_toon_params() +{ + static ClosureParam params[] = { + CLOSURE_FLOAT3_PARAM(DiffuseToonClosure, sc.N), + CLOSURE_FLOAT_PARAM(DiffuseToonClosure, sc.data0), + CLOSURE_FLOAT_PARAM(DiffuseToonClosure, sc.data1), + CLOSURE_STRING_KEYPARAM("label"), + CLOSURE_FINISH_PARAM(DiffuseToonClosure) + }; + return params; +} + +CLOSURE_PREPARE(closure_bsdf_diffuse_toon_prepare, DiffuseToonClosure) + +/* SPECULAR TOON */ + +class SpecularToonClosure : public CBSDFClosure { +public: + SpecularToonClosure() : CBSDFClosure(LABEL_GLOSSY) {} + + size_t memsize() const { return sizeof(*this); } + const char *name() const { return "specular_toon"; } + + void setup() + { + sc.prim = this; + m_shaderdata_flag = bsdf_specular_toon_setup(&sc); + } + + bool mergeable(const ClosurePrimitive *other) const + { + return false; + } + + void blur(float roughness) + { + bsdf_specular_toon_blur(&sc, roughness); + } + + void print_on(std::ostream &out) const + { + out << name() << " ((" << sc.N[0] << ", " << sc.N[1] << ", " << sc.N[2] << "))"; + } + + float3 eval_reflect(const float3 &omega_out, const float3 &omega_in, float& pdf) const + { + return bsdf_specular_toon_eval_reflect(&sc, omega_out, omega_in, &pdf); + } + + float3 eval_transmit(const float3 &omega_out, const float3 &omega_in, float& pdf) const + { + return bsdf_specular_toon_eval_transmit(&sc, omega_out, omega_in, &pdf); + } + + int sample(const float3 &Ng, + const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy, + float randu, float randv, + float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy, + float &pdf, float3 &eval) const + { + return bsdf_specular_toon_sample(&sc, Ng, omega_out, domega_out_dx, domega_out_dy, + randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf); + } +}; + +ClosureParam *closure_bsdf_specular_toon_params() +{ + static ClosureParam params[] = { + CLOSURE_FLOAT3_PARAM(SpecularToonClosure, sc.N), + CLOSURE_FLOAT_PARAM(SpecularToonClosure, sc.data0), + CLOSURE_FLOAT_PARAM(SpecularToonClosure, sc.data1), + CLOSURE_STRING_KEYPARAM("label"), + CLOSURE_FINISH_PARAM(SpecularToonClosure) + }; + return params; +} + +CLOSURE_PREPARE(closure_bsdf_specular_toon_prepare, SpecularToonClosure) + + +CCL_NAMESPACE_END + diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp index fa9f770d6ed..9e65cda1e8f 100644 --- a/intern/cycles/kernel/osl/osl_closures.cpp +++ b/intern/cycles/kernel/osl/osl_closures.cpp @@ -48,7 +48,6 @@ #include "closure/bsdf_diffuse.h" #include "closure/bsdf_microfacet.h" #include "closure/bsdf_oren_nayar.h" -#include "closure/bsdf_phong_ramp.h" #include "closure/bsdf_reflection.h" #include "closure/bsdf_refraction.h" #include "closure/bsdf_transparent.h" @@ -194,10 +193,14 @@ void OSLShader::register_closures(OSLShadingSystem *ss_) closure_holdout_params(), closure_holdout_prepare); register_closure(ss, "ambient_occlusion", id++, closure_ambient_occlusion_params(), closure_ambient_occlusion_prepare); - register_closure(ss, "phong_ramp", id++, - closure_bsdf_phong_ramp_params(), closure_bsdf_phong_ramp_prepare); register_closure(ss, "diffuse_ramp", id++, closure_bsdf_diffuse_ramp_params(), closure_bsdf_diffuse_ramp_prepare); + register_closure(ss, "phong_ramp", id++, + closure_bsdf_phong_ramp_params(), closure_bsdf_phong_ramp_prepare); + register_closure(ss, "diffuse_toon", id++, + closure_bsdf_diffuse_toon_params(), closure_bsdf_diffuse_toon_prepare); + register_closure(ss, "specular_toon", id++, + closure_bsdf_specular_toon_params(), closure_bsdf_specular_toon_prepare); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h index fe37c974e95..daccc03ede2 100644 --- a/intern/cycles/kernel/osl/osl_closures.h +++ b/intern/cycles/kernel/osl/osl_closures.h @@ -47,15 +47,19 @@ OSL::ClosureParam *closure_emission_params(); OSL::ClosureParam *closure_background_params(); OSL::ClosureParam *closure_holdout_params(); OSL::ClosureParam *closure_ambient_occlusion_params(); -OSL::ClosureParam *closure_bsdf_phong_ramp_params(); OSL::ClosureParam *closure_bsdf_diffuse_ramp_params(); +OSL::ClosureParam *closure_bsdf_phong_ramp_params(); +OSL::ClosureParam *closure_bsdf_diffuse_toon_params(); +OSL::ClosureParam *closure_bsdf_specular_toon_params(); void closure_emission_prepare(OSL::RendererServices *, int id, void *data); void closure_background_prepare(OSL::RendererServices *, int id, void *data); void closure_holdout_prepare(OSL::RendererServices *, int id, void *data); void closure_ambient_occlusion_prepare(OSL::RendererServices *, int id, void *data); -void closure_bsdf_phong_ramp_prepare(OSL::RendererServices *, int id, void *data); void closure_bsdf_diffuse_ramp_prepare(OSL::RendererServices *, int id, void *data); +void closure_bsdf_phong_ramp_prepare(OSL::RendererServices *, int id, void *data); +void closure_bsdf_diffuse_toon_prepare(OSL::RendererServices *, int id, void *data); +void closure_bsdf_specular_toon_prepare(OSL::RendererServices *, int id, void *data); enum { AmbientOcclusion = 100 diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index d6e52e28c62..498d10f385b 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -634,11 +634,10 @@ bool OSLRenderServices::get_attribute(void *renderstate, bool derivatives, ustri { KernelGlobals *kg = kernel_globals; ShaderData *sd = (ShaderData *)renderstate; - int object = sd->object; - int tri = sd->prim; + int object, tri; /* lookup of attribute on another object */ - if (object_name != u_empty) { + if (object_name != u_empty || sd == NULL) { OSLGlobals::ObjectNameMap::iterator it = kg->osl->object_name_map.find(object_name); if (it == kg->osl->object_name_map.end()) @@ -647,8 +646,12 @@ bool OSLRenderServices::get_attribute(void *renderstate, bool derivatives, ustri object = it->second; tri = ~0; } - else if (object == ~0) { - return get_background_attribute(kg, sd, name, type, derivatives, val); + else { + object = sd->object; + tri = sd->prim; + + if (object == ~0) + return get_background_attribute(kg, sd, name, type, derivatives, val); } /* find attribute on object */ diff --git a/intern/cycles/kernel/shaders/stdosl.h b/intern/cycles/kernel/shaders/stdosl.h index f4c0d0734bc..69ca6b32c36 100644 --- a/intern/cycles/kernel/shaders/stdosl.h +++ b/intern/cycles/kernel/shaders/stdosl.h @@ -161,7 +161,6 @@ vector cross (vector a, vector b) BUILTIN; float dot (vector a, vector b) BUILTIN; float length (vector v) BUILTIN; float distance (point a, point b) BUILTIN; -float distance (point a, point b, point q) BUILTIN; normal normalize (normal v) BUILTIN; vector normalize (vector v) BUILTIN; vector faceforward (vector N, vector I, vector Nref) BUILTIN; @@ -433,8 +432,10 @@ string concat (string a, string b, string c, string d, string e, string f) { closure color diffuse(normal N) BUILTIN; closure color oren_nayar(normal N, float sigma) BUILTIN; -closure color phong_ramp(normal N, float exponent, color colors[8]) BUILTIN; closure color diffuse_ramp(normal N, color colors[8]) BUILTIN; +closure color phong_ramp(normal N, float exponent, color colors[8]) BUILTIN; +closure color diffuse_toon(normal N, float size, float smooth) BUILTIN; +closure color specular_toon(normal N, float size, float smooth) BUILTIN; closure color translucent(normal N) BUILTIN; closure color reflection(normal N) BUILTIN; closure color refraction(normal N, float eta) BUILTIN; diff --git a/intern/cycles/kernel/svm/svm_math.h b/intern/cycles/kernel/svm/svm_math.h index db3b8d3f763..c7cd5200cd0 100644 --- a/intern/cycles/kernel/svm/svm_math.h +++ b/intern/cycles/kernel/svm/svm_math.h @@ -18,73 +18,6 @@ CCL_NAMESPACE_BEGIN -__device float safe_asinf(float a) -{ - if(a <= -1.0f) - return -M_PI_2_F; - else if(a >= 1.0f) - return M_PI_2_F; - - return asinf(a); -} - -__device float safe_acosf(float a) -{ - if(a <= -1.0f) - return M_PI_F; - else if(a >= 1.0f) - return 0.0f; - - return acosf(a); -} - -__device float compatible_powf(float x, float y) -{ - /* GPU pow doesn't accept negative x, do manual checks here */ - if(x < 0.0f) { - if(fmod(-y, 2.0f) == 0.0f) - return powf(-x, y); - else - return -powf(-x, y); - } - else if(x == 0.0f) - return 0.0f; - - return powf(x, y); -} - -__device float safe_powf(float a, float b) -{ - if(b == 0.0f) - return 1.0f; - if(a == 0.0f) - return 0.0f; - if(a < 0.0f && b != (int)b) - return 0.0f; - - return compatible_powf(a, b); -} - -__device float safe_logf(float a, float b) -{ - if(a < 0.0f || b < 0.0f) - return 0.0f; - - return logf(a)/logf(b); -} - -__device float safe_divide(float a, float b) -{ - float result; - - if(b == 0.0f) - result = 0.0f; - else - result = a/b; - - return result; -} - __device float svm_math(NodeMath type, float Fac1, float Fac2) { float Fac; diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 0830a700281..e1a583625fc 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -314,6 +314,7 @@ typedef enum ClosureType { CLOSURE_BSDF_DIFFUSE_ID, CLOSURE_BSDF_OREN_NAYAR_ID, CLOSURE_BSDF_DIFFUSE_RAMP_ID, + CLOSURE_BSDF_DIFFUSE_TOON_ID, CLOSURE_BSDF_GLOSSY_ID, CLOSURE_BSDF_REFLECTION_ID, @@ -323,6 +324,7 @@ typedef enum ClosureType { CLOSURE_BSDF_ASHIKHMIN_VELVET_ID, CLOSURE_BSDF_WESTIN_SHEEN_ID, CLOSURE_BSDF_PHONG_RAMP_ID, + CLOSURE_BSDF_SPECULAR_TOON_ID, CLOSURE_BSDF_TRANSMISSION_ID, CLOSURE_BSDF_TRANSLUCENT_ID, diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index bd9f16d64ef..5df8e8c1368 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -150,12 +150,17 @@ ObjectManager::~ObjectManager() void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene, Scene *scene, uint *object_flag, Progress& progress) { - float4 *objects = dscene->objects.resize(OBJECT_SIZE*scene->objects.size()); + float4 *objects; + float4 *objects_vector = NULL; int i = 0; map surface_area_map; Scene::MotionType need_motion = scene->need_motion(device->info.advanced_shading); bool have_motion = false; + objects = dscene->objects.resize(OBJECT_SIZE*scene->objects.size()); + if(need_motion == Scene::MOTION_PASS) + objects_vector = dscene->objects_vector.resize(OBJECT_VECTOR_SIZE*scene->objects.size()); + foreach(Object *ob, scene->objects) { Mesh *mesh = ob->mesh; uint flag = 0; @@ -205,8 +210,8 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene int offset = i*OBJECT_SIZE; memcpy(&objects[offset], &tfm, sizeof(float4)*3); - memcpy(&objects[offset+3], &itfm, sizeof(float4)*3); - objects[offset+6] = make_float4(surface_area, pass_id, random_number, __int_as_float(ob->particle_id)); + memcpy(&objects[offset+4], &itfm, sizeof(float4)*3); + objects[offset+8] = make_float4(surface_area, pass_id, random_number, __int_as_float(ob->particle_id)); if(need_motion == Scene::MOTION_PASS) { /* motion transformations, is world/object space depending if mesh @@ -220,8 +225,8 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene if(!mesh->attributes.find(ATTR_STD_MOTION_POST)) mtfm_post = mtfm_post * itfm; - memcpy(&objects[offset+8], &mtfm_pre, sizeof(float4)*4); - memcpy(&objects[offset+12], &mtfm_post, sizeof(float4)*4); + memcpy(&objects_vector[i*OBJECT_VECTOR_SIZE+0], &mtfm_pre, sizeof(float4)*3); + memcpy(&objects_vector[i*OBJECT_VECTOR_SIZE+3], &mtfm_post, sizeof(float4)*3); } #ifdef __OBJECT_MOTION__ else if(need_motion == Scene::MOTION_BLUR) { @@ -230,20 +235,16 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene DecompMotionTransform decomp; transform_motion_decompose(&decomp, &ob->motion, &ob->tfm); - memcpy(&objects[offset+8], &decomp, sizeof(float4)*8); + memcpy(&objects[offset], &decomp, sizeof(float4)*8); flag |= SD_OBJECT_MOTION; have_motion = true; } - else { - float4 no_motion = make_float4(FLT_MAX); - memcpy(&objects[offset+8], &no_motion, sizeof(float4)*8); - } } #endif /* dupli object coords */ - objects[offset+16] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], 0.0f); - objects[offset+17] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], 0.0f, 0.0f); + objects[offset+9] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], 0.0f); + objects[offset+10] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], 0.0f, 0.0f); /* object flag */ if(ob->use_holdout) @@ -256,6 +257,8 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene } device->tex_alloc("__objects", dscene->objects); + if(need_motion == Scene::MOTION_PASS) + device->tex_alloc("__objects_vector", dscene->objects_vector); dscene->data.bvh.have_motion = have_motion; } @@ -297,6 +300,9 @@ void ObjectManager::device_free(Device *device, DeviceScene *dscene) device->tex_free(dscene->objects); dscene->objects.clear(); + device->tex_free(dscene->objects_vector); + dscene->objects_vector.clear(); + device->tex_free(dscene->object_flag); dscene->object_flag.clear(); } diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h index 92ef692b4b9..ebe932e40e7 100644 --- a/intern/cycles/render/scene.h +++ b/intern/cycles/render/scene.h @@ -74,6 +74,7 @@ public: /* objects */ device_vector objects; + device_vector objects_vector; /* attributes */ device_vector attributes_map; diff --git a/intern/cycles/util/util_cuda.cpp b/intern/cycles/util/util_cuda.cpp index 2716f00e173..12cb0d3e254 100644 --- a/intern/cycles/util/util_cuda.cpp +++ b/intern/cycles/util/util_cuda.cpp @@ -394,10 +394,10 @@ bool cuLibraryInit() string cuCompilerPath() { #ifdef _WIN32 - const char *defaultpath = "C:/CUDA/bin"; + const char *defaultpaths[] = {"C:/CUDA/bin", NULL}; const char *executable = "nvcc.exe"; #else - const char *defaultpath = "/usr/local/cuda/bin"; + const char *defaultpaths[] = {"/Developer/NVIDIA/CUDA-4.2/bin", "/usr/local/cuda-4.2/bin", "/usr/local/cuda/bin", NULL}; const char *executable = "nvcc"; #endif @@ -405,13 +405,17 @@ string cuCompilerPath() string nvcc; - if(binpath) + if(binpath) { nvcc = path_join(binpath, executable); - else - nvcc = path_join(defaultpath, executable); + if(path_exists(nvcc)) + return nvcc; + } - if(path_exists(nvcc)) - return nvcc; + for(int i = 0; defaultpaths[i]; i++) { + nvcc = path_join(defaultpaths[i], executable); + if(path_exists(nvcc)) + return nvcc; + } #ifndef _WIN32 { diff --git a/intern/cycles/util/util_cuda.h b/intern/cycles/util/util_cuda.h index d9d956b7bd9..9682f1cfe1d 100644 --- a/intern/cycles/util/util_cuda.h +++ b/intern/cycles/util/util_cuda.h @@ -38,7 +38,7 @@ CCL_NAMESPACE_END #define CUDA_VERSION 3020 -#if defined(__x86_64) || defined(AMD64) || defined(_M_AMD64) +#if defined(__x86_64) || defined(AMD64) || defined(_M_AMD64) || defined(__LP64__) typedef unsigned long long CUdeviceptr; #else typedef unsigned int CUdeviceptr; diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h index 70adee4385b..8932c85db07 100644 --- a/intern/cycles/util/util_math.h +++ b/intern/cycles/util/util_math.h @@ -1092,6 +1092,75 @@ __device_inline float3 rotate_around_axis(float3 p, float3 axis, float angle) return r; } +/* NaN-safe math ops */ + +__device float safe_asinf(float a) +{ + if(a <= -1.0f) + return -M_PI_2_F; + else if(a >= 1.0f) + return M_PI_2_F; + + return asinf(a); +} + +__device float safe_acosf(float a) +{ + if(a <= -1.0f) + return M_PI_F; + else if(a >= 1.0f) + return 0.0f; + + return acosf(a); +} + +__device float compatible_powf(float x, float y) +{ + /* GPU pow doesn't accept negative x, do manual checks here */ + if(x < 0.0f) { + if(fmod(-y, 2.0f) == 0.0f) + return powf(-x, y); + else + return -powf(-x, y); + } + else if(x == 0.0f) + return 0.0f; + + return powf(x, y); +} + +__device float safe_powf(float a, float b) +{ + if(b == 0.0f) + return 1.0f; + if(a == 0.0f) + return 0.0f; + if(a < 0.0f && b != (int)b) + return 0.0f; + + return compatible_powf(a, b); +} + +__device float safe_logf(float a, float b) +{ + if(a < 0.0f || b < 0.0f) + return 0.0f; + + return logf(a)/logf(b); +} + +__device float safe_divide(float a, float b) +{ + float result; + + if(b == 0.0f) + result = 0.0f; + else + result = a/b; + + return result; +} + CCL_NAMESPACE_END #endif /* __UTIL_MATH_H__ */ diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h index a1c12ddf0e1..1f19f85f894 100644 --- a/intern/cycles/util/util_transform.h +++ b/intern/cycles/util/util_transform.h @@ -45,7 +45,7 @@ typedef struct Transform { * * For the DecompMotionTransform we drop scale from pre/post. */ -typedef struct MotionTransform { +typedef struct __may_alias MotionTransform { Transform pre; Transform mid; Transform post; diff --git a/intern/cycles/util/util_types.h b/intern/cycles/util/util_types.h index 3d246104ddc..00b6cf5c56e 100644 --- a/intern/cycles/util/util_types.h +++ b/intern/cycles/util/util_types.h @@ -39,12 +39,14 @@ #if defined(_WIN32) && !defined(FREE_WINDOWS) #define __device_inline static __forceinline #define __align(...) __declspec(align(__VA_ARGS__)) +#define __may_alias #else #define __device_inline static inline __attribute__((always_inline)) #ifndef FREE_WINDOWS64 #define __forceinline inline __attribute__((always_inline)) #endif #define __align(...) __attribute__((aligned(__VA_ARGS__))) +#define __may_alias __attribute__((__may_alias__)) #endif #endif diff --git a/intern/ghost/intern/GHOST_SystemCocoa.h b/intern/ghost/intern/GHOST_SystemCocoa.h index 9162b7ce4e0..a1b372dac9a 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.h +++ b/intern/ghost/intern/GHOST_SystemCocoa.h @@ -296,8 +296,6 @@ protected: /** Multitouch trackpad availability */ bool m_hasMultiTouchTrackpad; - /** Multitouch gesture in progress, useful to distinguish trackpad from mouse scroll events */ - bool m_isGestureInProgress; }; #endif // __GHOST_SYSTEMCOCOA_H__ diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index aca1a4071d8..39fd038d568 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -551,7 +551,6 @@ GHOST_SystemCocoa::GHOST_SystemCocoa() char *rstring = NULL; m_modifierMask =0; - m_isGestureInProgress = false; m_cursorDelta_x=0; m_cursorDelta_y=0; m_outsideLoopEventProcessed = false; @@ -1580,8 +1579,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) case NSScrollWheel: { - /* Send trackpad event if inside a trackpad gesture, send wheel event otherwise */ - if (!m_hasMultiTouchTrackpad || !m_isGestureInProgress) { + if (!m_hasMultiTouchTrackpad) { GHOST_TInt32 delta; double deltaF = [event deltaY]; @@ -1641,12 +1639,6 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) pushEvent(new GHOST_EventTrackpad([event timestamp] * 1000, window, GHOST_kTrackpadEventRotate, x, y, -[event rotation] * 5.0, 0)); } - case NSEventTypeBeginGesture: - m_isGestureInProgress = true; - break; - case NSEventTypeEndGesture: - m_isGestureInProgress = false; - break; default: return GHOST_kFailure; break; diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm index 9f738c345f4..471505538ba 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.mm +++ b/intern/ghost/intern/GHOST_WindowCocoa.mm @@ -67,13 +67,13 @@ extern "C" { } - (void)setSystemAndWindowCocoa:(GHOST_SystemCocoa *)sysCocoa windowCocoa:(GHOST_WindowCocoa *)winCocoa; -- (void)windowWillClose:(NSNotification *)notification; - (void)windowDidBecomeKey:(NSNotification *)notification; - (void)windowDidResignKey:(NSNotification *)notification; - (void)windowDidExpose:(NSNotification *)notification; - (void)windowDidResize:(NSNotification *)notification; - (void)windowDidMove:(NSNotification *)notification; - (void)windowWillMove:(NSNotification *)notification; +- (BOOL)windowShouldClose:(id)sender; @end @implementation CocoaWindowDelegate : NSObject @@ -83,11 +83,6 @@ extern "C" { associatedWindow = winCocoa; } -- (void)windowWillClose:(NSNotification *)notification -{ - systemCocoa->handleWindowEvent(GHOST_kEventWindowClose, associatedWindow); -} - - (void)windowDidBecomeKey:(NSNotification *)notification { systemCocoa->handleWindowEvent(GHOST_kEventWindowActivate, associatedWindow); @@ -132,6 +127,14 @@ extern "C" { wm_draw_update(ghostC); }*/ } + +- (BOOL)windowShouldClose:(id)sender; +{ + //Let Blender close the window rather than closing immediately + systemCocoa->handleWindowEvent(GHOST_kEventWindowClose, associatedWindow); + return false; +} + @end #pragma mark NSWindow subclass @@ -571,8 +574,6 @@ GHOST_WindowCocoa::GHOST_WindowCocoa( [m_window setContentView:m_openGLView]; [m_window setInitialFirstResponder:m_openGLView]; - [m_window setReleasedWhenClosed:NO]; //To avoid bad pointer exception in case of user closing the window - [m_window makeKeyAndOrderFront:nil]; setDrawingContextType(type); @@ -616,11 +617,6 @@ GHOST_WindowCocoa::~GHOST_WindowCocoa() [m_openGLView release]; if (m_window) { - // previously we called [m_window release], but on 10.8 this does not - // remove the window from [NSApp orderedWindows] and perhaps other - // places, leading to crashes. so instead we set setReleasedWhenClosed - // back to YES right before closing - [m_window setReleasedWhenClosed:YES]; [m_window close]; } @@ -955,7 +951,6 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) //Copy current window parameters [tmpWindow setTitle:[m_window title]]; [tmpWindow setRepresentedFilename:[m_window representedFilename]]; - [tmpWindow setReleasedWhenClosed:NO]; [tmpWindow setAcceptsMouseMovedEvents:YES]; [tmpWindow setDelegate:[m_window delegate]]; [tmpWindow setSystemAndWindowCocoa:[m_window systemCocoa] windowCocoa:this]; @@ -1013,7 +1008,6 @@ GHOST_TSuccess GHOST_WindowCocoa::setState(GHOST_TWindowState state) //Copy current window parameters [tmpWindow setTitle:[m_window title]]; [tmpWindow setRepresentedFilename:[m_window representedFilename]]; - [tmpWindow setReleasedWhenClosed:NO]; [tmpWindow setAcceptsMouseMovedEvents:YES]; [tmpWindow setDelegate:[m_window delegate]]; [tmpWindow setSystemAndWindowCocoa:[m_window systemCocoa] windowCocoa:this]; diff --git a/release/datafiles/blender_icons.sh b/release/datafiles/blender_icons.sh index 0bce9be6b8b..f923f02aee1 100755 --- a/release/datafiles/blender_icons.sh +++ b/release/datafiles/blender_icons.sh @@ -1,4 +1,5 @@ #!/bin/sh # This script updates icons from the SVG file -inkscape blender_icons.svg --without-gui --export-png=blender_icons.png +inkscape blender_icons.svg --export-dpi=90 --without-gui --export-png=blender_icons16.png +inkscape blender_icons.svg --export-dpi=180 --without-gui --export-png=blender_icons32.png diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg index 1e1f89d9b83..08a7c92935f 100644 --- a/release/datafiles/blender_icons.svg +++ b/release/datafiles/blender_icons.svg @@ -16,16 +16,219 @@ sodipodi:version="0.32" inkscape:version="0.48.2 r9819" version="1.0" - sodipodi:docname="blender_icons.svg" + sodipodi:docname="Blender ICONS - v.2.5.08.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" style="display:inline;enable-background:new" - inkscape:export-filename="blender_icons.png" - inkscape:export-xdpi="180" - inkscape:export-ydpi="180"> + inkscape:export-filename="/home/wolter/Documenten/Blender/icons/D:\Documents\Blender\icons\BF icons v.2.5.08a.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> Blender icons v. 2.5.06 + id="title49470">Blender icons v. 2.5.08 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + @@ -2157,37 +2391,6 @@ offset="1" style="stop-color:white;stop-opacity:1;" /> - - - - - - - - - - - - - - + + + + + + + + @@ -5502,6 +5709,68 @@ 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" /> + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + inkscape:collect="always" + id="linearGradient16500-11-1-4-3-1"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="stop16502-5-1-5-5-6" /> + id="stop16504-27-3-6-0-8" /> - + id="linearGradient3944-1-7-5-7-7"> + id="stop3946-7-4-3-6-6" /> + id="stop3948-1-2-5-7-1" /> - - - - - - - - - - - + id="linearGradient3952-5-7-6-8-9"> + id="stop3954-2-9-1-3-2" /> + id="stop3956-7-3-4-6-7" /> - - - - - - - - - - - + id="linearGradient3966-8-9-6-4-5"> + id="stop3968-2-8-2-4-4" /> + id="stop3970-4-6-6-1-3" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="linearGradient37542-4"> + id="linearGradient319-2"> + id="stop320-6" /> + id="stop321-72" /> + id="linearGradient10585-5"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="linearGradient1610-0"> + id="stop1611-6" /> + id="stop1612-42" /> + id="linearGradient40578-4-8-0"> + id="stop40580-8-9-61" /> + id="stop40582-6-8-7" /> + id="linearGradient58334-46"> - + id="linearGradient16500-46"> - - - - - + id="stop16502-4" /> + id="stop16504-6" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + x2="117.12428" + y2="56.069553" /> + id="linearGradient319-19-0-4"> + id="stop320-865-0-7" /> + id="stop321-02-0-8" /> + inkscape:collect="always" + xlink:href="#linearGradient14482-2" + id="linearGradient14563-3" + gradientUnits="userSpaceOnUse" + x1="149.55806" + y1="94.884857" + x2="149.53032" + y2="101.436" /> + + id="stop14484-6" /> + id="stop14486-5" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="linearGradient319-95-2-7-1-2"> + id="stop320-43-7-3-3-3" /> + id="stop321-12-7-4-1-9" /> + x1="126.55782" + y1="113.57294" + x2="132.41052" + y2="118.81034" /> + id="linearGradient10069-8-3-3-0-3"> + id="stop10071-9-8-7-1-8" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="stop10073-2-7-1-0-5" /> @@ -46632,17 +17773,6 @@ offset="1" id="stop321-02-0" /> - - - - + id="linearGradient15098"> + id="stop15100" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="stop15102" /> + x1="13.5" + y1="57.827747" + x2="11.472005" + y2="53.875874" /> + id="linearGradient13998-7-0"> + style="stop-color:#f57d07;stop-opacity:1;" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="stop-color:white;stop-opacity:1;" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + x1="-18.600719" + y1="501.96539" + x2="-26.642899" + y2="487.60382" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="linearGradient319-12-5"> + id="stop320-34-1" /> + id="stop321-81-9" /> + id="linearGradient15425-8-7"> + id="stop15427-5-9" /> + id="stop15429-7-2" /> - - - - - - - - + id="linearGradient319-35-31-8"> + id="stop320-38-14-4" /> + id="stop321-94-6-3" /> - - - - + id="linearGradient319-35-08-1"> + id="stop320-38-1-0" /> + id="stop321-94-1-0" /> - - - - + id="linearGradient319-35-0"> + id="stop320-38-15" /> + id="stop321-94-19" /> + id="linearGradient18105-2-9"> + + + + + + + + + + + + + + + + + + + + + id="stop27303-3-4" /> + id="stop27305-7-4" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="stop9032-3-3-8" /> + id="stop9034-1-6-2" /> + id="linearGradient44939-8-7-1-7-2-5-2"> + id="stop44941-8-4-5-4-7-8-1" /> - - - - - - - - - - + id="stop44943-2-0-2-0-1-0-2" /> + id="linearGradient40455-7-1-6-0"> + id="linearGradient40578-4-8-7-5-3"> + id="stop40580-8-9-6-1-7" /> + id="stop40582-6-8-1-8-7" /> + id="linearGradient16500-4-1-4"> + id="stop16502-31-1-1" /> + id="stop16504-23-1-2" /> - - - - - - + id="linearGradient44939-8-6-2"> + id="stop44941-8-0-7" /> + id="stop44943-2-7-6" /> - - - - - - - - - - - - - - - - - - - - - - - - - - + id="linearGradient44939-8-0-9"> + id="stop44941-8-1-2" /> + id="stop44943-2-3-1" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="linearGradient25108-1-0"> + + + + + + + - - - - - - - - + gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)" + x1="104.90227" + y1="53.227627" + x2="117.12428" + y2="56.069553" /> - - - - + gradientTransform="translate(207,-246.99988)" + x1="-56.5" + y1="342.0625" + x2="-49" + y2="341" /> - - - - + x1="149.55806" + y1="94.884857" + x2="149.53032" + y2="101.436" /> - - - - + x1="132" + y1="117.26753" + x2="142.72656" + y2="127.72736" /> - - - - - - - - - + x1="126.55782" + y1="113.57294" + x2="132.41052" + y2="118.81034" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 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" /> + + + + id="stop320-36" /> + id="stop321-21" /> + x1="732.9375" + y1="412.8125" + x2="753.40625" + y2="418.33594" /> + gradientTransform="translate(210.99996,-273.00002)" + x1="308" + y1="323" + x2="343.26239" + y2="340" /> - - - - - + id="linearGradient319-71"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + id="linearGradient319-995"> + id="stop320-08" /> + id="stop321-273" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="linearGradient16500-49"> + + + + gradientTransform="matrix(-1.1666676,0,0,-1.1666676,795.08409,370.66085)" + x1="262.04343" + y1="233.0448" + x2="273.85818" + y2="247.32738" /> + + + + + gradientTransform="matrix(0.53706486,0,0,0.53706486,426.82889,65.03941)" + x1="97.616623" + y1="39.47208" + x2="94.157646" + y2="35.759052" /> + + + + + gradientTransform="matrix(-0.53706486,0,0,-0.53706486,531.01948,106.93034)" + x1="97.616623" + y1="39.47208" + x2="94.157646" + y2="35.759052" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="linearGradient37542-7-8-6-0"> + style="stop-color:#ffffff;stop-opacity:1;" /> + style="stop-color:#030303;stop-opacity:1" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:snap-center="false" + inkscape:snap-object-midpoints="true"> image/svg+xml - Blender icons v. 2.5.06 + Blender icons v. 2.5.08 21.05.2012 @@ -50034,8 +22335,7 @@ inkscape:groupmode="layer" id="layer3" inkscape:label="bckgrnd" - style="display:none" - sodipodi:insensitive="true"> + style="display:inline"> + style="opacity:0.9;fill:#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="path23719" /> + style="opacity:0.9;fill:#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="path23723" /> + style="opacity:0.9;fill:#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="path23727" /> + style="opacity:0.9;fill:#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="path23731" /> + style="opacity:0.9;fill:#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="path23735" /> + style="opacity:0.9;fill:#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="path23739" /> + style="opacity:0.9;fill:#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="path23743" /> + style="opacity:0.9;fill:#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="path23747" /> + style="opacity:0.9;fill:#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="path23751" /> + style="opacity:0.9;fill:#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="path23755" /> + style="opacity:0.9;fill:#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="path23759" /> + style="opacity:0.9;fill:#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="path23763" /> + id="path10987" /> + id="path23771" /> + style="opacity:0.9;fill:#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="path23775" /> + style="opacity:0.9;fill:#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="path23779" /> + style="opacity:0.9;fill:#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="path23783" /> + style="opacity:0.9;fill:#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="path23787" /> + style="opacity:0.9;fill:#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="path23791" /> + style="opacity:0.9;fill:#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="path23795" /> + style="opacity:0.9;fill:#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="path23799" /> + style="opacity:0.9;fill:#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="path23803" /> + style="opacity:0.9;fill:#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="path23807" /> + style="opacity:0.9;fill:#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="path23811" /> + style="opacity:0.9;fill:#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="path23815" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path23827" /> + style="opacity:0.9;fill:#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="path23831" /> + style="opacity:0.9;fill:#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="path23835" /> + style="opacity:0.9;fill:#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="path23839" /> + style="opacity:0.9;fill:#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="path23843" /> + style="opacity:0.9;fill:#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="path23847" /> + style="opacity:0.9;fill:#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="path23851" /> + style="opacity:0.9;fill:#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="path23855" /> + style="opacity:0.9;fill:#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="path23859" /> + style="opacity:0.9;fill:#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="path23863" /> + style="opacity:0.9;fill:#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="path23867" /> + style="opacity:0.9;fill:#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="path23871" /> + id="path10992" /> + id="path23879" /> + style="opacity:0.9;fill:#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="path23883" /> + style="opacity:0.9;fill:#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="path23887" /> + style="opacity:0.9;fill:#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="path23891" /> + style="opacity:0.9;fill:#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="path23895" /> + style="opacity:0.9;fill:#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="path23899" /> + style="opacity:0.9;fill:#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="path23903" /> + style="opacity:0.9;fill:#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="path23907" /> + style="opacity:0.9;fill:#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="path23911" /> + style="opacity:0.9;fill:#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="path23915" /> + style="opacity:0.9;fill:#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="path23919" /> + style="opacity:0.9;fill:#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="path23923" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path23935" /> + style="opacity:0.9;fill:#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="path23939" /> + style="opacity:0.9;fill:#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="path23943" /> + style="opacity:0.9;fill:#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="path23947" /> + style="opacity:0.9;fill:#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="path23951" /> + style="opacity:0.9;fill:#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="path23955" /> + style="opacity:0.9;fill:#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="path23959" /> + style="opacity:0.9;fill:#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="path23963" /> + style="opacity:0.9;fill:#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="path23967" /> + style="opacity:0.9;fill:#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="path23971" /> + style="opacity:0.9;fill:#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="path23975" /> + style="opacity:0.9;fill:#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="path23979" /> + id="path10996" /> + style="opacity:0.9;fill:#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="path23989" /> + style="opacity:0.9;fill:#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="path23993" /> + style="opacity:0.9;fill:#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="path23997" /> + style="opacity:0.9;fill:#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="path24001" /> + style="opacity:0.9;fill:#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="path24005" /> + style="opacity:0.9;fill:#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="path24009" /> + style="opacity:0.9;fill:#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="path24013" /> + style="opacity:0.9;fill:#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="path24017" /> + style="opacity:0.9;fill:#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="path24021" /> + style="opacity:0.9;fill:#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="path24025" /> + style="opacity:0.9;fill:#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="path24029" /> + style="opacity:0.9;fill:#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="path24033" /> + id="path10998" /> + id="path24041" /> + style="opacity:0.9;fill:#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="path24045" /> + style="opacity:0.9;fill:#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="path24049" /> + style="opacity:0.9;fill:#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="path24053" /> + style="opacity:0.9;fill:#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="path24057" /> + style="opacity:0.9;fill:#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="path24061" /> + style="opacity:0.9;fill:#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="path24065" /> + style="opacity:0.9;fill:#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="path24069" /> + style="opacity:0.9;fill:#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="path24073" /> + style="opacity:0.9;fill:#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="path24077" /> + style="opacity:0.9;fill:#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="path24081" /> + style="opacity:0.9;fill:#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="path24085" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path24097" /> + style="opacity:0.9;fill:#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="path24101" /> + style="opacity:0.9;fill:#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="path24105" /> + style="opacity:0.9;fill:#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="path24109" /> + style="opacity:0.9;fill:#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="path24113" /> + style="opacity:0.9;fill:#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="path24117" /> + style="opacity:0.9;fill:#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="path24121" /> + style="opacity:0.9;fill:#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="path24125" /> + style="opacity:0.9;fill:#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="path24129" /> + style="opacity:0.9;fill:#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="path24133" /> + style="opacity:0.9;fill:#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="path24137" /> + style="opacity:0.9;fill:#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="path24141" /> + id="path11002" /> + id="path24149" /> + style="opacity:0.9;fill:#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="path24153" /> + style="opacity:0.9;fill:#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="path24157" /> + style="opacity:0.9;fill:#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="path24161" /> + style="opacity:0.9;fill:#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="path24165" /> + style="opacity:0.9;fill:#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="path24169" /> + style="opacity:0.9;fill:#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="path24173" /> + style="opacity:0.9;fill:#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="path24177" /> + style="opacity:0.9;fill:#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="path24181" /> + style="opacity:0.9;fill:#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="path24185" /> + style="opacity:0.9;fill:#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="path24189" /> + style="opacity:0.9;fill:#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="path24193" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path24205" /> + style="opacity:0.9;fill:#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="path24209" /> + style="opacity:0.9;fill:#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="path24213" /> + style="opacity:0.9;fill:#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="path24217" /> + style="opacity:0.9;fill:#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="path24221" /> + style="opacity:0.9;fill:#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="path24225" /> + style="opacity:0.9;fill:#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="path24229" /> + style="opacity:0.9;fill:#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="path24233" /> + style="opacity:0.9;fill:#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="path24237" /> + style="opacity:0.9;fill:#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="path24241" /> + style="opacity:0.9;fill:#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="path24245" /> + style="opacity:0.9;fill:#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="path24249" /> + id="path11006" /> + id="path24257" /> + style="opacity:0.9;fill:#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="path24261" /> + style="opacity:0.9;fill:#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="path24265" /> + style="opacity:0.9;fill:#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="path24269" /> + style="opacity:0.9;fill:#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="path24273" /> + style="opacity:0.9;fill:#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="path24277" /> + style="opacity:0.9;fill:#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="path24281" /> + style="opacity:0.9;fill:#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="path24285" /> + style="opacity:0.9;fill:#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="path24289" /> + style="opacity:0.9;fill:#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="path24293" /> + style="opacity:0.9;fill:#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="path24297" /> + style="opacity:0.9;fill:#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="path24301" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path24313" /> + style="opacity:0.9;fill:#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="path24317" /> + style="opacity:0.9;fill:#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="path24321" /> + style="opacity:0.9;fill:#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="path24325" /> + style="opacity:0.9;fill:#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="path24329" /> + style="opacity:0.9;fill:#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="path24333" /> + style="opacity:0.9;fill:#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="path24337" /> + style="opacity:0.9;fill:#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="path24341" /> + style="opacity:0.9;fill:#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="path24345" /> + style="opacity:0.9;fill:#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="path24349" /> + style="opacity:0.9;fill:#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="path24353" /> + style="opacity:0.9;fill:#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="path24357" /> + id="path11010" /> + id="path24365" /> + style="opacity:0.9;fill:#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="path24369" /> + style="opacity:0.9;fill:#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="path24373" /> + style="opacity:0.9;fill:#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="path24377" /> + style="opacity:0.9;fill:#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="path24381" /> + style="opacity:0.9;fill:#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="path24385" /> + style="opacity:0.9;fill:#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="path24389" /> + style="opacity:0.9;fill:#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="path24393" /> + style="opacity:0.9;fill:#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="path24397" /> + style="opacity:0.9;fill:#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="path24401" /> + style="opacity:0.9;fill:#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="path24405" /> + style="opacity:0.9;fill:#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="path24409" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path24421" /> + style="opacity:0.9;fill:#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="path24425" /> + style="opacity:0.9;fill:#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="path24429" /> + style="opacity:0.9;fill:#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="path24433" /> + style="opacity:0.9;fill:#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="path24437" /> + style="opacity:0.9;fill:#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="path24441" /> + style="opacity:0.9;fill:#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="path24445" /> + style="opacity:0.9;fill:#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="path24449" /> + style="opacity:0.9;fill:#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="path24453" /> + style="opacity:0.9;fill:#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="path24457" /> + style="opacity:0.9;fill:#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="path24461" /> + style="opacity:0.9;fill:#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="path24465" /> + id="path11014" /> + id="path24473" /> + style="opacity:0.9;fill:#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="path24477" /> + style="opacity:0.9;fill:#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="path24481" /> + style="opacity:0.9;fill:#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="path24485" /> + style="opacity:0.9;fill:#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="path24489" /> + style="opacity:0.9;fill:#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="path24493" /> + style="opacity:0.9;fill:#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="path24497" /> + style="opacity:0.9;fill:#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="path24501" /> + style="opacity:0.9;fill:#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="path24505" /> + style="opacity:0.9;fill:#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="path24509" /> + style="opacity:0.9;fill:#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="path24513" /> + style="opacity:0.9;fill:#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="path24517" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path24529" /> + style="opacity:0.9;fill:#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="path24533" /> + style="opacity:0.9;fill:#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="path24537" /> + style="opacity:0.9;fill:#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="path24541" /> + style="opacity:0.9;fill:#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="path24545" /> + style="opacity:0.9;fill:#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="path24549" /> + style="opacity:0.9;fill:#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="path24553" /> + style="opacity:0.9;fill:#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="path24557" /> + style="opacity:0.9;fill:#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="path24561" /> + style="opacity:0.9;fill:#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="path24565" /> + style="opacity:0.9;fill:#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="path24569" /> + style="opacity:0.9;fill:#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="path24573" /> + id="path11018" /> + id="path24581" /> + style="opacity:0.9;fill:#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="path24585" /> + style="opacity:0.9;fill:#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="path24589" /> + style="opacity:0.9;fill:#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="path24593" /> + style="opacity:0.9;fill:#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="path24597" /> + style="opacity:0.9;fill:#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="path24601" /> + style="opacity:0.9;fill:#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="path24605" /> + style="opacity:0.9;fill:#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="path24609" /> + style="opacity:0.9;fill:#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="path24613" /> + style="opacity:0.9;fill:#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="path24617" /> + style="opacity:0.9;fill:#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="path24621" /> + style="opacity:0.9;fill:#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="path24625" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path24638" /> + style="opacity:0.9;fill:#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="path24642" /> + style="opacity:0.9;fill:#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="path24646" /> + style="opacity:0.9;fill:#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="path24650" /> + style="opacity:0.9;fill:#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="path24654" /> + style="opacity:0.9;fill:#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="path24658" /> + style="opacity:0.9;fill:#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="path24662" /> + style="opacity:0.9;fill:#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="path24666" /> + style="opacity:0.9;fill:#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="path24670" /> + style="opacity:0.9;fill:#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="path24674" /> + style="opacity:0.9;fill:#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="path24678" /> + style="opacity:0.9;fill:#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="path24682" /> + id="path11022" /> + id="path24690" /> + style="opacity:0.9;fill:#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="path24694" /> + style="opacity:0.9;fill:#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="path24698" /> + style="opacity:0.9;fill:#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="path24702" /> + style="opacity:0.9;fill:#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="path24706" /> + style="opacity:0.9;fill:#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="path24710" /> + style="opacity:0.9;fill:#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="path24714" /> + style="opacity:0.9;fill:#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="path24718" /> + style="opacity:0.9;fill:#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="path24722" /> + style="opacity:0.9;fill:#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="path24726" /> + style="opacity:0.9;fill:#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="path24730" /> + style="opacity:0.9;fill:#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="path24734" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path24746" /> + style="opacity:0.9;fill:#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="path24750" /> + style="opacity:0.9;fill:#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="path24754" /> + style="opacity:0.9;fill:#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="path24758" /> + style="opacity:0.9;fill:#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="path24762" /> + style="opacity:0.9;fill:#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="path24766" /> + style="opacity:0.9;fill:#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="path24770" /> + style="opacity:0.9;fill:#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="path24774" /> + style="opacity:0.9;fill:#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="path24778" /> + style="opacity:0.9;fill:#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="path24782" /> + style="opacity:0.9;fill:#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="path24786" /> + style="opacity:0.9;fill:#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="path24790" /> + id="path11026" /> + id="path24798" /> + style="opacity:0.9;fill:#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="path24802" /> + style="opacity:0.9;fill:#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="path24806" /> + style="opacity:0.9;fill:#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="path24810" /> + style="opacity:0.9;fill:#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="path24814" /> + style="opacity:0.9;fill:#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="path24818" /> + style="opacity:0.9;fill:#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="path24822" /> + style="opacity:0.9;fill:#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="path24826" /> + style="opacity:0.9;fill:#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="path24830" /> + style="opacity:0.9;fill:#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="path24834" /> + style="opacity:0.9;fill:#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="path24838" /> + style="opacity:0.9;fill:#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="path24842" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path24854" /> + style="opacity:0.9;fill:#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="path24858" /> + style="opacity:0.9;fill:#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="path24862" /> + style="opacity:0.9;fill:#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="path24866" /> + style="opacity:0.9;fill:#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="path24870" /> + style="opacity:0.9;fill:#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="path24874" /> + style="opacity:0.9;fill:#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="path24878" /> + style="opacity:0.9;fill:#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="path24882" /> + style="opacity:0.9;fill:#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="path24886" /> + style="opacity:0.9;fill:#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="path24890" /> + style="opacity:0.9;fill:#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="path24894" /> + style="opacity:0.9;fill:#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="path24898" /> + id="path11030" /> + id="path24906" /> + style="opacity:0.9;fill:#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="path24910" /> + style="opacity:0.9;fill:#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="path24914" /> + style="opacity:0.9;fill:#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="path24918" /> + style="opacity:0.9;fill:#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="path24922" /> + style="opacity:0.9;fill:#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="path24926" /> + style="opacity:0.9;fill:#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="path24930" /> + style="opacity:0.9;fill:#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="path24934" /> + style="opacity:0.9;fill:#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="path24938" /> + style="opacity:0.9;fill:#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="path24942" /> + style="opacity:0.9;fill:#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="path24946" /> + style="opacity:0.9;fill:#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="path24950" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path39840" /> + style="opacity:0.9;fill:#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="path39844" /> + style="opacity:0.9;fill:#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="path39848" /> + style="opacity:0.9;fill:#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="path39852" /> + style="opacity:0.9;fill:#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="path39856" /> + style="opacity:0.9;fill:#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="path39860" /> + style="opacity:0.9;fill:#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="path39864" /> + style="opacity:0.9;fill:#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="path39868" /> + style="opacity:0.9;fill:#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="path39872" /> + style="opacity:0.9;fill:#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="path39876" /> + style="opacity:0.9;fill:#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="path39880" /> + style="opacity:0.9;fill:#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="path39884" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path39900" /> + style="opacity:0.9;fill:#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="path39904" /> + style="opacity:0.9;fill:#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="path39909" /> + style="opacity:0.9;fill:#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="path39913" /> + style="opacity:0.9;fill:#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="path39917" /> + style="opacity:0.9;fill:#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="path39921" /> + style="opacity:0.9;fill:#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="path39925" /> + style="opacity:0.9;fill:#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="path39929" /> + style="opacity:0.9;fill:#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="path39933" /> + style="opacity:0.9;fill:#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="path39937" /> + style="opacity:0.9;fill:#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="path39941" /> + style="opacity:0.9;fill:#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="path39945" /> + id="path39947" /> + id="path39955" /> + style="opacity:0.9;fill:#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="path39959" /> + style="opacity:0.9;fill:#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="path39963" /> + style="opacity:0.9;fill:#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="path39967" /> + style="opacity:0.9;fill:#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="path39971" /> + style="opacity:0.9;fill:#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="path39975" /> + style="opacity:0.9;fill:#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="path39979" /> + style="opacity:0.9;fill:#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="path39983" /> + style="opacity:0.9;fill:#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="path39987" /> + style="opacity:0.9;fill:#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="path39991" /> + style="opacity:0.9;fill:#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="path39995" /> + style="opacity:0.9;fill:#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="path39999" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path40013" /> + style="opacity:0.9;fill:#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="path40017" /> + style="opacity:0.9;fill:#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="path40021" /> + style="opacity:0.9;fill:#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="path40025" /> + style="opacity:0.9;fill:#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="path40029" /> + style="opacity:0.9;fill:#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="path40033" /> + style="opacity:0.9;fill:#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="path40038" /> + style="opacity:0.9;fill:#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="path40042" /> + style="opacity:0.9;fill:#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="path40046" /> + style="opacity:0.9;fill:#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="path40050" /> + style="opacity:0.9;fill:#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="path40054" /> + style="opacity:0.9;fill:#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="path40058" /> + id="path40060" /> + id="path40068" /> + style="opacity:0.9;fill:#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="path40072" /> + style="opacity:0.9;fill:#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="path40076" /> + style="opacity:0.9;fill:#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="path40080" /> + style="opacity:0.9;fill:#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="path40084" /> + style="opacity:0.9;fill:#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="path40088" /> + style="opacity:0.9;fill:#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="path40092" /> + style="opacity:0.9;fill:#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="path40096" /> + style="opacity:0.9;fill:#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="path40100" /> + style="opacity:0.9;fill:#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="path40104" /> + style="opacity:0.9;fill:#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="path40108" /> + style="opacity:0.9;fill:#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="path40112" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="opacity:0.9;fill:#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="path40126" /> + style="opacity:0.9;fill:#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="path40130" /> + style="opacity:0.9;fill:#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="path40134" /> + style="opacity:0.9;fill:#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="path40138" /> + style="opacity:0.9;fill:#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="path40142" /> + style="opacity:0.9;fill:#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="path40146" /> + style="opacity:0.9;fill:#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="path40150" /> + style="opacity:0.9;fill:#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="path40154" /> + style="opacity:0.9;fill:#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="path40158" /> + style="opacity:0.9;fill:#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="path40162" /> + style="opacity:0.9;fill:#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="path40166" /> + style="opacity:0.9;fill:#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="path40170" /> + id="path40172" /> @@ -54833,44 +26408,54 @@ + + + id="g28552-1"> + id="g28574-5"> + id="g28596-2"> + id="g28610-5"> + id="g28626-9"> + id="g28646-1"> + id="g28666-1"> + id="g28688-4"> + id="g28706-1"> + id="g28716-4"> + id="g28728-1"> + id="g28744-8"> + id="g28760-4"> @@ -55426,41 +27012,42 @@ x="548" height="1" width="1" - id="rect10765" + 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" /> @@ -55469,64 +27056,65 @@ x="538" height="5" width="1" - id="rect10801" + 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" /> @@ -55535,29 +27123,30 @@ x="549" height="5" width="1" - id="rect10682" + 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" /> @@ -55566,41 +27155,42 @@ x="548" height="5" width="1" - id="rect10692" + 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" /> @@ -55609,56 +27199,57 @@ x="544" height="5" width="1" - id="rect10708" + 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" /> @@ -55667,10 +27258,10 @@ x="550" height="5" width="1" - id="rect10750" + 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" /> @@ -55679,98 +27270,100 @@ x="556" height="5" width="1" - id="rect10754" + 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" /> @@ -55779,87 +27372,90 @@ x="555" height="5" width="1" - id="rect10877" + 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" /> @@ -55868,80 +27464,82 @@ x="542" height="5" width="1" - id="rect10932" + 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" /> @@ -55949,52 +27547,53 @@ + style="display:inline;enable-background:new" + id="a28530-2"> + id="g11054-5"> @@ -56003,429 +27602,424 @@ x="2" height="5" width="1" - id="rect19480" + 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" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -56434,381 +28028,954 @@ x="2" height="5" width="1" - id="rect11144" + 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" /> + + + + + + + + + + + + + + + transform="translate(810,316)" + id="g72798" + style="opacity:0.5;display:inline;enable-background:new"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + 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" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -57625,145 +30164,142 @@ + id="g33683" + transform="translate(0,2)"> + - - - - - - + transform="translate(263.91329,149.04559)" + id="g11360" + style="display:inline"> + + + + + + - + transform="translate(263,148.99995)" + id="g11368" + style="display:inline"> - - - - + 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)"> + inkscape:export-ydpi="90" + transform="matrix(0.874026,0,0,0.873701,-3.948211,-5.552958)" /> - + transform="matrix(0.398744,0,0,-0.395524,58.82401,144.1804)" /> + + + - @@ -59846,42 +32375,34 @@ + id="g106468"> + + + + - - - - - - - - @@ -59914,44 +32435,6 @@ inkscape:connector-curvature="0" /> - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + transform="translate(105,-82)"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -78237,80 +49763,79 @@ + id="g56105"> - - - - - - - - + x="530" + y="52" /> + + + + + + + + + + + y="452" + ry="0.453125" /> + transform="matrix(0,1,-1,0,0,0)" + ry="0.65625" /> @@ -81171,7 +52698,8 @@ width="2" id="rect36439" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - transform="matrix(0,1,-1,0,0,0)" /> + transform="matrix(0,1,-1,0,0,0)" + ry="0.609375" /> + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + ry="0.5" /> + x="277.49176" + y="-11.287262" + ry="0.5" /> + y="-10" + ry="0.390625" /> + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + ry="0.5" /> - - - - - + y="-11.0625" + ry="0.5" /> + style="opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + ry="0.5" /> + y="-10" + ry="0.5" /> - - - - - - - - - - - - - - - - - - - - + id="g36980" /> + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + transform="translate(41.84997,0.15003049)"> @@ -88360,82 +59588,6 @@ inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - + id="g106643"> + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -97820,114 +70725,10 @@ style="display:inline;enable-background:new" id="g23641" transform="translate(40,359)"> - - - - - - - - - - - - - - - - + id="g23646" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +