From 1a6f51e06566e7c8421f579c2b9d3801c05283d4 Mon Sep 17 00:00:00 2001 From: Roman Kuznetsov Date: Thu, 20 Dec 2018 22:57:21 +0300 Subject: [PATCH] [Vulkan] Added SPIR-V shaders generator --- .gitignore | 1 + android/assets/vulkan_shaders | 1 + android/build.gradle | 2 +- data/vulkan_shaders/Accuracy.frag.spv | Bin 0 -> 1496 bytes data/vulkan_shaders/Accuracy.vert.spv | Bin 0 -> 3436 bytes data/vulkan_shaders/Area.frag.spv | Bin 0 -> 1336 bytes data/vulkan_shaders/Area.vert.spv | Bin 0 -> 2972 bytes data/vulkan_shaders/Area3d.frag.spv | Bin 0 -> 1892 bytes data/vulkan_shaders/Area3d.vert.spv | Bin 0 -> 3212 bytes data/vulkan_shaders/Area3dOutline.frag.spv | Bin 0 -> 1336 bytes data/vulkan_shaders/Area3dOutline.vert.spv | Bin 0 -> 2300 bytes data/vulkan_shaders/AreaOutline.frag.spv | Bin 0 -> 1336 bytes data/vulkan_shaders/AreaOutline.vert.spv | Bin 0 -> 2972 bytes data/vulkan_shaders/Arrow3d.frag.spv | Bin 0 -> 1824 bytes data/vulkan_shaders/Arrow3d.vert.spv | Bin 0 -> 1632 bytes data/vulkan_shaders/Arrow3dOutline.frag.spv | Bin 0 -> 1552 bytes data/vulkan_shaders/Arrow3dOutline.vert.spv | Bin 0 -> 1368 bytes data/vulkan_shaders/Arrow3dShadow.frag.spv | Bin 0 -> 1488 bytes data/vulkan_shaders/Arrow3dShadow.vert.spv | Bin 0 -> 1368 bytes data/vulkan_shaders/Bookmark.frag.spv | Bin 0 -> 2456 bytes data/vulkan_shaders/Bookmark.vert.spv | Bin 0 -> 3852 bytes .../vulkan_shaders/BookmarkAboveText.frag.spv | Bin 0 -> 2456 bytes .../vulkan_shaders/BookmarkAboveText.vert.spv | Bin 0 -> 3852 bytes .../BookmarkAboveTextBillboard.frag.spv | Bin 0 -> 2456 bytes .../BookmarkAboveTextBillboard.vert.spv | Bin 0 -> 4332 bytes data/vulkan_shaders/BookmarkAnim.frag.spv | Bin 0 -> 2456 bytes data/vulkan_shaders/BookmarkAnim.vert.spv | Bin 0 -> 3852 bytes .../BookmarkAnimAboveText.frag.spv | Bin 0 -> 2456 bytes .../BookmarkAnimAboveText.vert.spv | Bin 0 -> 3852 bytes .../BookmarkAnimAboveTextBillboard.frag.spv | Bin 0 -> 2456 bytes .../BookmarkAnimAboveTextBillboard.vert.spv | Bin 0 -> 4332 bytes .../BookmarkAnimBillboard.frag.spv | Bin 0 -> 2456 bytes .../BookmarkAnimBillboard.vert.spv | Bin 0 -> 4332 bytes .../vulkan_shaders/BookmarkBillboard.frag.spv | Bin 0 -> 2456 bytes .../vulkan_shaders/BookmarkBillboard.vert.spv | Bin 0 -> 4332 bytes data/vulkan_shaders/CapJoin.frag.spv | Bin 0 -> 2092 bytes data/vulkan_shaders/CapJoin.vert.spv | Bin 0 -> 3316 bytes data/vulkan_shaders/CirclePoint.frag.spv | Bin 0 -> 2344 bytes data/vulkan_shaders/CirclePoint.vert.spv | Bin 0 -> 3256 bytes data/vulkan_shaders/ColoredSymbol.frag.spv | Bin 0 -> 2552 bytes data/vulkan_shaders/ColoredSymbol.vert.spv | Bin 0 -> 3392 bytes .../ColoredSymbolBillboard.frag.spv | Bin 0 -> 2552 bytes .../ColoredSymbolBillboard.vert.spv | Bin 0 -> 3944 bytes data/vulkan_shaders/DashedLine.frag.spv | Bin 0 -> 2372 bytes data/vulkan_shaders/DashedLine.vert.spv | Bin 0 -> 5380 bytes data/vulkan_shaders/DebugRect.frag.spv | Bin 0 -> 992 bytes data/vulkan_shaders/DebugRect.vert.spv | Bin 0 -> 920 bytes data/vulkan_shaders/HatchingArea.frag.spv | Bin 0 -> 1704 bytes data/vulkan_shaders/HatchingArea.vert.spv | Bin 0 -> 3136 bytes data/vulkan_shaders/Line.frag.spv | Bin 0 -> 1944 bytes data/vulkan_shaders/Line.vert.spv | Bin 0 -> 4984 bytes data/vulkan_shaders/MaskedTexturing.frag.spv | Bin 0 -> 1732 bytes data/vulkan_shaders/MaskedTexturing.vert.spv | Bin 0 -> 3192 bytes .../MaskedTexturingBillboard.frag.spv | Bin 0 -> 1732 bytes .../MaskedTexturingBillboard.vert.spv | Bin 0 -> 3896 bytes data/vulkan_shaders/MyPosition.frag.spv | Bin 0 -> 1496 bytes data/vulkan_shaders/MyPosition.vert.spv | Bin 0 -> 3724 bytes data/vulkan_shaders/PathSymbol.frag.spv | Bin 0 -> 1496 bytes data/vulkan_shaders/PathSymbol.vert.spv | Bin 0 -> 3620 bytes data/vulkan_shaders/Route.frag.spv | Bin 0 -> 3512 bytes data/vulkan_shaders/Route.vert.spv | Bin 0 -> 5504 bytes data/vulkan_shaders/RouteArrow.frag.spv | Bin 0 -> 2216 bytes data/vulkan_shaders/RouteArrow.vert.spv | Bin 0 -> 4788 bytes data/vulkan_shaders/RouteDash.frag.spv | Bin 0 -> 3464 bytes data/vulkan_shaders/RouteDash.vert.spv | Bin 0 -> 5504 bytes data/vulkan_shaders/RouteMarker.frag.spv | Bin 0 -> 3228 bytes data/vulkan_shaders/RouteMarker.vert.spv | Bin 0 -> 4332 bytes data/vulkan_shaders/Ruler.frag.spv | Bin 0 -> 1404 bytes data/vulkan_shaders/Ruler.vert.spv | Bin 0 -> 1752 bytes data/vulkan_shaders/ScreenQuad.frag.spv | Bin 0 -> 1168 bytes data/vulkan_shaders/ScreenQuad.vert.spv | Bin 0 -> 1084 bytes .../SmaaBlendingWeight.frag.spv | Bin 0 -> 12056 bytes .../SmaaBlendingWeight.vert.spv | Bin 0 -> 2300 bytes data/vulkan_shaders/SmaaEdges.frag.spv | Bin 0 -> 4176 bytes data/vulkan_shaders/SmaaEdges.vert.spv | Bin 0 -> 1924 bytes data/vulkan_shaders/SmaaFinal.frag.spv | Bin 0 -> 3584 bytes data/vulkan_shaders/SmaaFinal.vert.spv | Bin 0 -> 1372 bytes data/vulkan_shaders/Text.frag.spv | Bin 0 -> 2072 bytes data/vulkan_shaders/Text.vert.spv | Bin 0 -> 3388 bytes data/vulkan_shaders/TextBillboard.frag.spv | Bin 0 -> 2072 bytes data/vulkan_shaders/TextBillboard.vert.spv | Bin 0 -> 4092 bytes data/vulkan_shaders/TextFixed.frag.spv | Bin 0 -> 1748 bytes data/vulkan_shaders/TextFixed.vert.spv | Bin 0 -> 3388 bytes .../TextFixedBillboard.frag.spv | Bin 0 -> 1748 bytes .../TextFixedBillboard.vert.spv | Bin 0 -> 4092 bytes data/vulkan_shaders/TextOutlined.frag.spv | Bin 0 -> 2072 bytes data/vulkan_shaders/TextOutlined.vert.spv | Bin 0 -> 4060 bytes .../TextOutlinedBillboard.frag.spv | Bin 0 -> 2072 bytes .../TextOutlinedBillboard.vert.spv | Bin 0 -> 4608 bytes data/vulkan_shaders/TextOutlinedGui.frag.spv | Bin 0 -> 1980 bytes data/vulkan_shaders/TextOutlinedGui.vert.spv | Bin 0 -> 2780 bytes .../TextStaticOutlinedGui.frag.spv | Bin 0 -> 1980 bytes .../TextStaticOutlinedGui.vert.spv | Bin 0 -> 2780 bytes data/vulkan_shaders/Texturing.frag.spv | Bin 0 -> 1496 bytes data/vulkan_shaders/Texturing.vert.spv | Bin 0 -> 3044 bytes .../TexturingBillboard.frag.spv | Bin 0 -> 1496 bytes .../TexturingBillboard.vert.spv | Bin 0 -> 3748 bytes data/vulkan_shaders/TexturingGui.frag.spv | Bin 0 -> 1404 bytes data/vulkan_shaders/TexturingGui.vert.spv | Bin 0 -> 1476 bytes data/vulkan_shaders/Traffic.frag.spv | Bin 0 -> 3472 bytes data/vulkan_shaders/Traffic.vert.spv | Bin 0 -> 6048 bytes data/vulkan_shaders/TrafficCircle.frag.spv | Bin 0 -> 2416 bytes data/vulkan_shaders/TrafficCircle.vert.spv | Bin 0 -> 5648 bytes data/vulkan_shaders/TrafficLine.frag.spv | Bin 0 -> 1604 bytes data/vulkan_shaders/TrafficLine.vert.spv | Bin 0 -> 3124 bytes data/vulkan_shaders/Transit.frag.spv | Bin 0 -> 1324 bytes data/vulkan_shaders/Transit.vert.spv | Bin 0 -> 4624 bytes data/vulkan_shaders/TransitCircle.frag.spv | Bin 0 -> 2292 bytes data/vulkan_shaders/TransitCircle.vert.spv | Bin 0 -> 5100 bytes data/vulkan_shaders/TransitMarker.frag.spv | Bin 0 -> 2476 bytes data/vulkan_shaders/TransitMarker.vert.spv | Bin 0 -> 4104 bytes shaders/GL/circle.vsh.glsl | 3 +- shaders/GL/dashed_line.fsh.glsl | 2 +- shaders/GL/line.fsh.glsl | 4 +- shaders/GL/smaa_blending_weight.fsh.glsl | 6 +- shaders/GL/text.fsh.glsl | 4 +- shaders/GL/text_fixed.fsh.glsl | 4 +- shaders/program_params.hpp | 4 - shaders/vulkan_shaders_preprocessor.py | 441 ++++++++++++++++++ tools/unix/generate_vulkan_shaders.sh | 19 + 120 files changed, 476 insertions(+), 15 deletions(-) create mode 120000 android/assets/vulkan_shaders create mode 100644 data/vulkan_shaders/Accuracy.frag.spv create mode 100644 data/vulkan_shaders/Accuracy.vert.spv create mode 100644 data/vulkan_shaders/Area.frag.spv create mode 100644 data/vulkan_shaders/Area.vert.spv create mode 100644 data/vulkan_shaders/Area3d.frag.spv create mode 100644 data/vulkan_shaders/Area3d.vert.spv create mode 100644 data/vulkan_shaders/Area3dOutline.frag.spv create mode 100644 data/vulkan_shaders/Area3dOutline.vert.spv create mode 100644 data/vulkan_shaders/AreaOutline.frag.spv create mode 100644 data/vulkan_shaders/AreaOutline.vert.spv create mode 100644 data/vulkan_shaders/Arrow3d.frag.spv create mode 100644 data/vulkan_shaders/Arrow3d.vert.spv create mode 100644 data/vulkan_shaders/Arrow3dOutline.frag.spv create mode 100644 data/vulkan_shaders/Arrow3dOutline.vert.spv create mode 100644 data/vulkan_shaders/Arrow3dShadow.frag.spv create mode 100644 data/vulkan_shaders/Arrow3dShadow.vert.spv create mode 100644 data/vulkan_shaders/Bookmark.frag.spv create mode 100644 data/vulkan_shaders/Bookmark.vert.spv create mode 100644 data/vulkan_shaders/BookmarkAboveText.frag.spv create mode 100644 data/vulkan_shaders/BookmarkAboveText.vert.spv create mode 100644 data/vulkan_shaders/BookmarkAboveTextBillboard.frag.spv create mode 100644 data/vulkan_shaders/BookmarkAboveTextBillboard.vert.spv create mode 100644 data/vulkan_shaders/BookmarkAnim.frag.spv create mode 100644 data/vulkan_shaders/BookmarkAnim.vert.spv create mode 100644 data/vulkan_shaders/BookmarkAnimAboveText.frag.spv create mode 100644 data/vulkan_shaders/BookmarkAnimAboveText.vert.spv create mode 100644 data/vulkan_shaders/BookmarkAnimAboveTextBillboard.frag.spv create mode 100644 data/vulkan_shaders/BookmarkAnimAboveTextBillboard.vert.spv create mode 100644 data/vulkan_shaders/BookmarkAnimBillboard.frag.spv create mode 100644 data/vulkan_shaders/BookmarkAnimBillboard.vert.spv create mode 100644 data/vulkan_shaders/BookmarkBillboard.frag.spv create mode 100644 data/vulkan_shaders/BookmarkBillboard.vert.spv create mode 100644 data/vulkan_shaders/CapJoin.frag.spv create mode 100644 data/vulkan_shaders/CapJoin.vert.spv create mode 100644 data/vulkan_shaders/CirclePoint.frag.spv create mode 100644 data/vulkan_shaders/CirclePoint.vert.spv create mode 100644 data/vulkan_shaders/ColoredSymbol.frag.spv create mode 100644 data/vulkan_shaders/ColoredSymbol.vert.spv create mode 100644 data/vulkan_shaders/ColoredSymbolBillboard.frag.spv create mode 100644 data/vulkan_shaders/ColoredSymbolBillboard.vert.spv create mode 100644 data/vulkan_shaders/DashedLine.frag.spv create mode 100644 data/vulkan_shaders/DashedLine.vert.spv create mode 100644 data/vulkan_shaders/DebugRect.frag.spv create mode 100644 data/vulkan_shaders/DebugRect.vert.spv create mode 100644 data/vulkan_shaders/HatchingArea.frag.spv create mode 100644 data/vulkan_shaders/HatchingArea.vert.spv create mode 100644 data/vulkan_shaders/Line.frag.spv create mode 100644 data/vulkan_shaders/Line.vert.spv create mode 100644 data/vulkan_shaders/MaskedTexturing.frag.spv create mode 100644 data/vulkan_shaders/MaskedTexturing.vert.spv create mode 100644 data/vulkan_shaders/MaskedTexturingBillboard.frag.spv create mode 100644 data/vulkan_shaders/MaskedTexturingBillboard.vert.spv create mode 100644 data/vulkan_shaders/MyPosition.frag.spv create mode 100644 data/vulkan_shaders/MyPosition.vert.spv create mode 100644 data/vulkan_shaders/PathSymbol.frag.spv create mode 100644 data/vulkan_shaders/PathSymbol.vert.spv create mode 100644 data/vulkan_shaders/Route.frag.spv create mode 100644 data/vulkan_shaders/Route.vert.spv create mode 100644 data/vulkan_shaders/RouteArrow.frag.spv create mode 100644 data/vulkan_shaders/RouteArrow.vert.spv create mode 100644 data/vulkan_shaders/RouteDash.frag.spv create mode 100644 data/vulkan_shaders/RouteDash.vert.spv create mode 100644 data/vulkan_shaders/RouteMarker.frag.spv create mode 100644 data/vulkan_shaders/RouteMarker.vert.spv create mode 100644 data/vulkan_shaders/Ruler.frag.spv create mode 100644 data/vulkan_shaders/Ruler.vert.spv create mode 100644 data/vulkan_shaders/ScreenQuad.frag.spv create mode 100644 data/vulkan_shaders/ScreenQuad.vert.spv create mode 100644 data/vulkan_shaders/SmaaBlendingWeight.frag.spv create mode 100644 data/vulkan_shaders/SmaaBlendingWeight.vert.spv create mode 100644 data/vulkan_shaders/SmaaEdges.frag.spv create mode 100644 data/vulkan_shaders/SmaaEdges.vert.spv create mode 100644 data/vulkan_shaders/SmaaFinal.frag.spv create mode 100644 data/vulkan_shaders/SmaaFinal.vert.spv create mode 100644 data/vulkan_shaders/Text.frag.spv create mode 100644 data/vulkan_shaders/Text.vert.spv create mode 100644 data/vulkan_shaders/TextBillboard.frag.spv create mode 100644 data/vulkan_shaders/TextBillboard.vert.spv create mode 100644 data/vulkan_shaders/TextFixed.frag.spv create mode 100644 data/vulkan_shaders/TextFixed.vert.spv create mode 100644 data/vulkan_shaders/TextFixedBillboard.frag.spv create mode 100644 data/vulkan_shaders/TextFixedBillboard.vert.spv create mode 100644 data/vulkan_shaders/TextOutlined.frag.spv create mode 100644 data/vulkan_shaders/TextOutlined.vert.spv create mode 100644 data/vulkan_shaders/TextOutlinedBillboard.frag.spv create mode 100644 data/vulkan_shaders/TextOutlinedBillboard.vert.spv create mode 100644 data/vulkan_shaders/TextOutlinedGui.frag.spv create mode 100644 data/vulkan_shaders/TextOutlinedGui.vert.spv create mode 100644 data/vulkan_shaders/TextStaticOutlinedGui.frag.spv create mode 100644 data/vulkan_shaders/TextStaticOutlinedGui.vert.spv create mode 100644 data/vulkan_shaders/Texturing.frag.spv create mode 100644 data/vulkan_shaders/Texturing.vert.spv create mode 100644 data/vulkan_shaders/TexturingBillboard.frag.spv create mode 100644 data/vulkan_shaders/TexturingBillboard.vert.spv create mode 100644 data/vulkan_shaders/TexturingGui.frag.spv create mode 100644 data/vulkan_shaders/TexturingGui.vert.spv create mode 100644 data/vulkan_shaders/Traffic.frag.spv create mode 100644 data/vulkan_shaders/Traffic.vert.spv create mode 100644 data/vulkan_shaders/TrafficCircle.frag.spv create mode 100644 data/vulkan_shaders/TrafficCircle.vert.spv create mode 100644 data/vulkan_shaders/TrafficLine.frag.spv create mode 100644 data/vulkan_shaders/TrafficLine.vert.spv create mode 100644 data/vulkan_shaders/Transit.frag.spv create mode 100644 data/vulkan_shaders/Transit.vert.spv create mode 100644 data/vulkan_shaders/TransitCircle.frag.spv create mode 100644 data/vulkan_shaders/TransitCircle.vert.spv create mode 100644 data/vulkan_shaders/TransitMarker.frag.spv create mode 100644 data/vulkan_shaders/TransitMarker.vert.spv create mode 100644 shaders/vulkan_shaders_preprocessor.py create mode 100755 tools/unix/generate_vulkan_shaders.sh diff --git a/.gitignore b/.gitignore index c1f2a30f5c..89bb59012d 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ data/patterns_design.txt data/route_points.dat data/bookmarks/ data/bookmarks_backup/ +data/vulkan_shaders/debug/* # Compiled Python *.pyc diff --git a/android/assets/vulkan_shaders b/android/assets/vulkan_shaders new file mode 120000 index 0000000000..99474fc892 --- /dev/null +++ b/android/assets/vulkan_shaders @@ -0,0 +1 @@ +../../data/vulkan_shaders \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index c72b82bdea..ac7d8855a2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -455,7 +455,7 @@ android { // We don't compress these extensions in assets/ because our random FileReader can't read zip-compressed files from apk. // TODO: Load all minor files via separate call to ReadAsString which can correctly handle compressed files in zip containers. aaptOptions { - noCompress 'txt', 'bin', 'html', 'png', 'json', 'mwm', 'ttf', 'sdf', 'ui', 'config', 'csv' + noCompress 'txt', 'bin', 'html', 'png', 'json', 'mwm', 'ttf', 'sdf', 'ui', 'config', 'csv', 'spv' ignoreAssetsPattern "!.svn:!.git:!.DS_Store:!*.scc:.*:_*:!CVS:!thumbs.db:!picasa.ini:!*~" } diff --git a/data/vulkan_shaders/Accuracy.frag.spv b/data/vulkan_shaders/Accuracy.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..e89368439dd28f01f730f484c3be00d67c7badaa GIT binary patch literal 1496 zcmZ9MTW`}q5QUdqOAEbF+ENN77bqa43M8nI5QtL1eTb9?3Org->{dpO9XWBhJn_Q+ z;wSKPctPTPwl_5_n#`UvXJ%(-U8 zd5B`!R5Kx(71J~|d2BQYA_8l&J=v;s@H#-dYF6t&Nj0-*oSy6S`%dqTI~rmt7%_F-%$U?2LY(+t z;F?*FvpIJZ$B8$QOtGrjkbnQGuiH1WJ$&kpV$Tmh1pa5S&5Y;%sXI>MPjnn-cWYibdKA?^o(}76yv>i3w*3x`e)T;$NIIno3a0LyzOeH%k!vT&I6P8 zQf6zx{h!CY%6VY&zRPSL+<9K!7js1SQ)YF{5bl?ZyW00)F3hqcV_DqJVTSo`?JU;y zik#V24bEY|sa-?9CEHRx`T=uhOTP>9aM-rK#zlGJ+_}6g-ch|J1<;XysSv?EE3kc6 z&RY>rJ$gaU?5PEh9?W~fT@$`4PcQVhs~xj|vu1mx)~0ysqM;U;dF5P9^*A%H{XlW> zwv5^v`n@jSlCg+`cVzTJ{TuSsqJJB|r9HDH-jb&u;@~^-#Ng-$yjO7Kqq`?F=G*H7 zeLd8s7Z!QH#qdp$%e(M@1GSzDGhhA&m@Sz3U6C=nkIF)~E<*$VLKVq}JJiYC<))1J zFaz#M9eU#XA$F)bE%~;LT<&T$or3=%4LMyI9Jw~{w)QrU^TFt-L4S9PI5Fk|{-bF> GmHh?Lwr>Og literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Accuracy.vert.spv b/data/vulkan_shaders/Accuracy.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..cc29eb9c3e1e9348f61c4f329509000f864b6653 GIT binary patch literal 3436 zcmZveX>$~15XXm{+&2NQm=F&XL@2{$*n2Zm7++WJ4|w@Vi*cnkw&uI=BxWfPVgIdz_zvWMfj9u2yDd zD$|#%^X+zZsr#^zRvTF}t=6+nI^WG!Qtj6F*k#T6#&W&aU=WMmGY83bJ7?6|?Z(5| zY^Bw`-l;X07FwOf11k%YQ;Q3elT!;vr!YzM-NM?|EZ2vqsnl29v>T+plE0SL8n@(z zlbvwgh@RH-)1cVvPj<6fx4v(&wp&YCH*4j6aeor-#)TO=JCw_)$#QkERZkl?v-Cdf zaL(JWy!e_yfpRFP1tF}
fKIjxt-Rzu{g_qt@1~U9FNO2GyAlJ zNY(>Mg|!J$YZNx#XRR8H+)#1{?rx(xn|5xdoo?zi=jX`#xEG~cle{(MeAevFWskUJ zWA*2=Qpf|zB0{^?skxd4S@{R;OOpF`Um{?SJ;J5Z6BX z41z2ChCY$APjkE=`D}%sb@ckF>vs-BEV;FQeQ>>g>iRtf;V1W>Uy+yhsok$2?7U04 z-$13DD}5`}=AG^bKB12nYOZ^qqor=VJEgp74QCBPNdDHZX9jh--F#A)-m97 zu+&G8&C5KVWi=0TRJW(rX)bZ*m&n?UvVVs)?m_!`bnB5fu6n)X!rvF)n4y1#>^-Y{Um5T*UYFH) zo}s={>XEm)v#3qf;Vhb;@yz=X;P=vTX5Di=%SWF-V0ix!?Wgqb(^Pq=i!~v z8zA~Tf~>#&yIJl%ArJjO2F8$&etuH&EUVn7CD+^ITX5RC7w=Q_$GtzvJ!)_@2YdS& zu%DrSj%-iAD|`P1vNrN@XH{hD@mBCwGzE z3%h&B+W8*(?uFgg$nJe#-YfqdNc5GDTKtcVwRyhphI-V{MmBB=qK0pf<+bwK@(8&qbmw>$RF;+i_8eT>&YS@tX@fCDA{RY4w=mYj9dZ zAGN-QY^^^K%{Z?EZR8`)A!Oqm1mX7vvV6?_VPrY|!|zSx@H0Pk?V`RT<^DfZq3rDa E3#c>`VE_OC literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Area.frag.spv b/data/vulkan_shaders/Area.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..0d8d45f86873a6a1e3b5f6c375e50d58fff037a0 GIT binary patch literal 1336 zcmZ9KOK;Oa6on@bC#9t=rO=jF>$FRx3M8nI5Qy?}7m>2yv9+Sut&AKyavlg)Z2G_Y z6Zko7kT~Di6ATmG%$#!{bM76tnnzt@8v3o9LsPCT(-byl&2;P@^gr~Er?cqz$qJRyvuc8V7z_qM|6MqmOv35xTN;OH zlEq<^6!B=5EMnqTYH>+6O6O5Mz*9v1Ue9>un(jJJvSIorPxHcvXGeR}b?jNt%)@aW#p&lH{wlU>dHS1&lOq3uqTKe@ktXt+r7v0Jvya6vo1W*zSk$s6 z6Pkw?MLwUzk*4PELhq7)j6P3u5|<^EnCfUb=C=sn7sHFPkwCiXjm4Q6vx2I>{SsQ= z_3C^kA6i+S>`ea-A6fQaj(0+f%cK8#9+&jXY9L+0|}{^pgsm>F?b zG8f0Z;C{;J+s&T7(RwIjIovCujlH)#x9#^>pOIhrw)K)|>8UpNbKcRZqurP7>K=50 z(cy?lEePz)DoU?kZP4Q?ThFW0ygu5-grQMfN`(cG| z>Wp^$+uD5@3qSalMeuFKl(p!``S)}tAO9Wgu3s=S!v}{RFyAH|`PAvjjQRfdM6Zrc z`eYIFOAOxvxy+4km|8D{+4)wP)k{U=1D~oYI(KCBPJi@34)^WK@SUnMdhg1}r4JXw l+rwWfhMfB{IC5Ry1D#zS_k)RZ+Wg9okDkH5O~X8s{Q)$}V)6h0 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Area.vert.spv b/data/vulkan_shaders/Area.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..e9de55a3b7660b49b6079da0f03783e9ec6e8145 GIT binary patch literal 2972 zcmZ9OYj;ys5QaBR(+gMxk(+2usTZ_bVHpY-ftHIY5>26{;`I=lQ`T`MIcJ?DMfk)Q z*YczOBY%QF$1k#cpMCb!kli)e^S*m#_RQ=_R!b9$)6N~x-<`LAcn^)be*C+MaZ6!UxMaf;sH;(A67Jz1gfc zZbv&=7WD^DJ8{%WdU4cF@_1*E?8Vs4jMyc;ozAd5YEYKN=$&O{dqj7%vaIuTBiTy_ zTY0P3-%a!GxxL+Lt-D*T)^;z{Wa99h)1G1G@sw%`c;5}Xvg!-`{kYZn4sP1LCT?KS zy|l+H@-b?r}r{;BpX?fW?Nq!kGzgCtd#u>D-zgBwkCdCKd8ZWwjbcHG%c;wNIK zJx}k3QI@B_&>g&;&Sw1CL~-^~!NqwIlb0GskMnex#cjQw-9_*A`3ps@*Wh{yJ?j&r zEbBYkA9tdSINy%*LHsK`G2mI8SyAK*PrjZ{dV|g6nO?J~mziME|F5-Yt-RF@cw-E2 zj$vkLFWN~vY3}>^z3{NWTV%z%Fl()S?q-_iZC^)S_tF1(32R-L-m}V*b$uFM^z6%= zz94?K%#Zp;{lNIGN-P%KxF2sd>IcT}xy1b7{`V{L;tjF;OJa7sAKc%PdYC1Asg-v; zD`6R4D4_SZw>vb(kuw}SF|jLRmi%{F(8uE~te4pF7A)>UAH5sQ-4^o)=`3t{FXC`^ zOgC}Yg5psx`Uz=M+AETivZpU#YOm;XMmrpGN_aNtc78BmcmX;$lNAFz*dV?$@ib2sO=CD_jk-_dS8!v0HP>VoG! z@ZG?fe?ypwAhyotFcrZJ)amIC3<*&jLq&8;V%mQTSueIWx1SxNF*PNSK3F33v0p zHzn|Y$Oivgl9~kG{JxNmA2VQnb?NZtw=NxD_-pDCJ%PiXxJ?NhXY>bb@$Y%wIcCJ- z-q`J+Z)?@$RQ3v$`N1+lqvk#Q8Jy@~m`n#HOiE@;!M+0*|nW zRgzc@?@BLfnDu>oPZ$orNeSOs-jUu|53#WxzAt^ehv&q>Tdf~Rr`F#UjW{1luz|NY pA4w<9lEnNzmJa`0@LQG+hrjuKBHjGR4~(7FcRrlIP!;IR-hXY0=r#ZV literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Area3d.frag.spv b/data/vulkan_shaders/Area3d.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..5b6204f156506d3d84ded14f84985c5be58f3bfd GIT binary patch literal 1892 zcmZ9M+fEZv6o$971q9_FauUTB6b~q(0-{C~QOiY>YDB%9H0?mfluk1}C|>D>w?2~( zpox#;jfwxaXLcFgX0g}*uj5{8YNl^-z?c*IciKEK@fkOL!p01netQ>7uS+Yfc5P*C zeHD)pld+EYjG94{)r}lhf(C|h$&%!%WK6!;R76_F=G#zU)(n|q$t#x2#nN-H+H88Q z_EFvU>OsTzYC+^z+d-o^sI}B@n{cYfX5IbObX3+7PQTU#Y zL;L=I^-O$UYzw+!doQXqTKi#iD5{r}DR#VrDC{)-nkMUN@tz)kJMMoLt`U$T=`m+# z-1S~Wm4o=9ypx%Cy`a(d8?B&yWQuwVZ|4*>Df9)4j&VVlci=mcva!ec9?qD_MBh~& z-p9#FcJ}71%1?h_ddTbV zplR$uRsZtUbsABX3ZZ&(KWh(DD$!97f{+d1_{#gmU-@Mjm~g2x}suHo=Ms~dm% zpAnwYO>gu&FO6BjIdQ#{dqzBU@F6#tdBRN!pVOU}P-{8CbJD4W{k-nHgo7P?!6Nvq zojbYc4}4iSvGhPa@KVBIzapJl_+tn28-XJ~{B_CCAEhmaZ^ZbqtFND+twFv!(y2w9 z^S>|Mm`~3(^mWo3bK=m~Z!vtc)Mn58-$eW)VfMxEja`A+#~BH`c&8}*CM5X4mz9Ct z@H>P@IJ||r+vS0v+OjafM zkZW5Ud%7zj2m5pVtR=jA+qy8Z9LH@)hfB}kUc#kkuqlps{IQdp87%3>_D2~uC4T`g Ce}*Ig literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Area3d.vert.spv b/data/vulkan_shaders/Area3d.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..ebf8efb03ec148c05bc72a41c98e5d0a3e2da81b GIT binary patch literal 3212 zcmZvd+j10D6o#9GB!~e-j-FydJcEb`5k*LV;GjkWB*X)1Gs!fu<76gICK0$1%i>*c*y;l zt4SY!)>2K;@^;>&5bb;6uAQHzyZ%B(P1e%oW-Y7F<=NM;0|jrbYw1d>xnwm)C)l^e$voU*J-wW@=CW2hyMIgIsmp;>RXX0uxtn$1?NtbL$3>*^-93N?EkLnh(5 zgzj1R^npwKhCW)b|K+%-$s>hdC(b&%V_XkhcbvL$cR|F-{TtV*%QMyQ z7Z84)r`)fgQr<0N?bUNV1bjjt>8OS7nK}z=)b9C(ZvJ_6pUxZB*;7t`xlUYf;TL;) zE-_zo`rfH)-@~u#2zAWAcx%+h-0IF$ZXfyq)?pBPsUHMB#y`fYueqZ( zXWs4qQmLDd*RjaQQq-<~9GJs=ud!O6J=vT4jR9w&uK(-6{Q93_HCBK1NmgwU?|K#Z z?8S42Rlg5e&8gkG)x8_BkNn5r{_j7XjTwJ}zWQ5h{0J3V8aPu_g$-bp$4YqC0nu&aAV<)W7sa+2Jc z9OE4@uXn}A9Dl(0?wZ@X>9^imLifAbt^18sKZCz_bO-Q$ULlKf+*NWc4>-Ru`dL%> z?Jha%xlBfLJ_?N2U%U7G9C^KWj|1Pp|`DsqvzK;TV;bULkjo9ZEWcQh7qV9VP z$QkEd^8VPj=O1e{(ty=RPr~3&?WDZ8j%; z^|7u=){DUV**&MXOFrgQLEmgnm*BO0Q8YJ-fw|i_)jCtg?_oze=N`L3c5b>Kg0Qbo(1w(!F_VhvHJYQ#I#)lRp56@ zIdXrB>|TT13TyiecyFDdw%GG?v-8^iJIX#`m literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Area3dOutline.frag.spv b/data/vulkan_shaders/Area3dOutline.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..0d8d45f86873a6a1e3b5f6c375e50d58fff037a0 GIT binary patch literal 1336 zcmZ9KOK;Oa6on@bC#9t=rO=jF>$FRx3M8nI5Qy?}7m>2yv9+Sut&AKyavlg)Z2G_Y z6Zko7kT~Di6ATmG%$#!{bM76tnnzt@8v3o9LsPCT(-byl&2;P@^gr~Er?cqz$qJRyvuc8V7z_qM|6MqmOv35xTN;OH zlEq<^6!B=5EMnqTYH>+6O6O5Mz*9v1Ue9>un(jJJvSIorPxHcvXGeR}b?jNt%)@aW#p&lH{wlU>dHS1&lOq3uqTKe@ktXt+r7v0Jvya6vo1W*zSk$s6 z6Pkw?MLwUzk*4PELhq7)j6P3u5|<^EnCfUb=C=sn7sHFPkwCiXjm4Q6vx2I>{SsQ= z_3C^kA6i+S>`ea-A6fQaj(0+f%cK8#9+&jXY9L+0|}{^pgsm>F?b zG8f0Z;C{;J+s&T7(RwIjIovCujlH)#x9#^>pOIhrw)K)|>8UpNbKcRZqurP7>K=50 z(cy?lEePz)DoU?kZP4Q?ThFW0ygu5-grQMfN`(cG| z>Wp^$+uD5@3qSalMeuFKl(p!``S)}tAO9Wgu3s=S!v}{RFyAH|`PAvjjQRfdM6Zrc z`eYIFOAOxvxy+4km|8D{+4)wP)k{U=1D~oYI(KCBPJi@34)^WK@SUnMdhg1}r4JXw l+rwWfhMfB{IC5Ry1D#zS_k)RZ+Wg9okDkH5O~X8s{Q)$}V)6h0 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Area3dOutline.vert.spv b/data/vulkan_shaders/Area3dOutline.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..52ca5f80e787e6961046a31ec7860f9811e8772c GIT binary patch literal 2300 zcmZ9NTT>H35QT?J08v0hKtwTsf{Nk|5JezdgH==o3#5G8qR2|E6|$*Kg31#wzUx2o zC-`%GvC8x9ZewJqlbJr#eY&S-5?Y$a+nsCDUzdC9lF{p$WjlA-wZ(IOdv|-fS}RV^ z%s$1V+qJ}w`1H6-@w!!?#|J?fGIoNzEH?-Z+M55idU_D zE%{z4DEnS9i2TD^aN^_F(cl-94@>o8qeDg>jX5*QK_!*2>N5JHh67JlPzyp;#r}11 z?^g>tRa?B4>FVBbSoBN#f&W=-d(2a7-K#|5C#oUZX|E&RYfkopld!fI9h9pd!{|8K zPc-RF-8+iHdc`lQTb7Gj&-rK6lW_xZpjX_*iFX*5!YIz2lU+~jJ+fq^#a$hob8BH372~?{il?6= z0%J=yy<}vBEq$6j9<%>*dSLEq?3ct*Z(|%baXG=X;4a3|`^GqI;?4w%gZmek)Wx0P z_fs%G?gQ?ZkWb$Rv7D8A850<0k0xduZ+CI|0!Pho%xL15Xtu=tml^AE7uHMsa%^aj zE2p_JH#WIVb46^c}8W_MqmhV7ahw z2n^zfG~R?q8n4-NdWc_(NL>6dL$Gr6dzahN?U&n0c(NB-s1 z2@XB%T*`6Rt6HOH`PZ~Y3m$)L-WMG8;=3s@%-)Kv)Ac!hE79TJ8Pxn+4Bu6>cxU`J zbGAjtFq#B< zWqHQ6CQm`1|tji2>pPHVJz*VdPpTEp8J=e6dHKcvYSUkUiYqr$FRx3M8nI5Qy?}7m>2yv9+Sut&AKyavlg)Z2G_Y z6Zko7kT~Di6ATmG%$#!{bM76tnnzt@8v3o9LsPCT(-byl&2;P@^gr~Er?cqz$qJRyvuc8V7z_qM|6MqmOv35xTN;OH zlEq<^6!B=5EMnqTYH>+6O6O5Mz*9v1Ue9>un(jJJvSIorPxHcvXGeR}b?jNt%)@aW#p&lH{wlU>dHS1&lOq3uqTKe@ktXt+r7v0Jvya6vo1W*zSk$s6 z6Pkw?MLwUzk*4PELhq7)j6P3u5|<^EnCfUb=C=sn7sHFPkwCiXjm4Q6vx2I>{SsQ= z_3C^kA6i+S>`ea-A6fQaj(0+f%cK8#9+&jXY9L+0|}{^pgsm>F?b zG8f0Z;C{;J+s&T7(RwIjIovCujlH)#x9#^>pOIhrw)K)|>8UpNbKcRZqurP7>K=50 z(cy?lEePz)DoU?kZP4Q?ThFW0ygu5-grQMfN`(cG| z>Wp^$+uD5@3qSalMeuFKl(p!``S)}tAO9Wgu3s=S!v}{RFyAH|`PAvjjQRfdM6Zrc z`eYIFOAOxvxy+4km|8D{+4)wP)k{U=1D~oYI(KCBPJi@34)^WK@SUnMdhg1}r4JXw l+rwWfhMfB{IC5Ry1D#zS_k)RZ+Wg9okDkH5O~X8s{Q)$}V)6h0 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/AreaOutline.vert.spv b/data/vulkan_shaders/AreaOutline.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..e9de55a3b7660b49b6079da0f03783e9ec6e8145 GIT binary patch literal 2972 zcmZ9OYj;ys5QaBR(+gMxk(+2usTZ_bVHpY-ftHIY5>26{;`I=lQ`T`MIcJ?DMfk)Q z*YczOBY%QF$1k#cpMCb!kli)e^S*m#_RQ=_R!b9$)6N~x-<`LAcn^)be*C+MaZ6!UxMaf;sH;(A67Jz1gfc zZbv&=7WD^DJ8{%WdU4cF@_1*E?8Vs4jMyc;ozAd5YEYKN=$&O{dqj7%vaIuTBiTy_ zTY0P3-%a!GxxL+Lt-D*T)^;z{Wa99h)1G1G@sw%`c;5}Xvg!-`{kYZn4sP1LCT?KS zy|l+H@-b?r}r{;BpX?fW?Nq!kGzgCtd#u>D-zgBwkCdCKd8ZWwjbcHG%c;wNIK zJx}k3QI@B_&>g&;&Sw1CL~-^~!NqwIlb0GskMnex#cjQw-9_*A`3ps@*Wh{yJ?j&r zEbBYkA9tdSINy%*LHsK`G2mI8SyAK*PrjZ{dV|g6nO?J~mziME|F5-Yt-RF@cw-E2 zj$vkLFWN~vY3}>^z3{NWTV%z%Fl()S?q-_iZC^)S_tF1(32R-L-m}V*b$uFM^z6%= zz94?K%#Zp;{lNIGN-P%KxF2sd>IcT}xy1b7{`V{L;tjF;OJa7sAKc%PdYC1Asg-v; zD`6R4D4_SZw>vb(kuw}SF|jLRmi%{F(8uE~te4pF7A)>UAH5sQ-4^o)=`3t{FXC`^ zOgC}Yg5psx`Uz=M+AETivZpU#YOm;XMmrpGN_aNtc78BmcmX;$lNAFz*dV?$@ib2sO=CD_jk-_dS8!v0HP>VoG! z@ZG?fe?ypwAhyotFcrZJ)amIC3<*&jLq&8;V%mQTSueIWx1SxNF*PNSK3F33v0p zHzn|Y$Oivgl9~kG{JxNmA2VQnb?NZtw=NxD_-pDCJ%PiXxJ?NhXY>bb@$Y%wIcCJ- z-q`J+Z)?@$RQ3v$`N1+lqvk#Q8Jy@~m`n#HOiE@;!M+0*|nW zRgzc@?@BLfnDu>oPZ$orNeSOs-jUu|53#WxzAt^ehv&q>Tdf~Rr`F#UjW{1luz|NY pA4w<9lEnNzmJa`0@LQG+hrjuKBHjGR4~(7FcRrlIP!;IR-hXY0=r#ZV literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Arrow3d.frag.spv b/data/vulkan_shaders/Arrow3d.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..09c2398824b54f4960e8a86a218adc18e497a8b1 GIT binary patch literal 1824 zcmY+ESyK~16os3F0J12EY@(Qe3X0;!Dni&aJfw`4T0TxqB?G2RCe%!l0-yB3SAUuQ zA78XQ-=w=LHg(hYoV#}49@43Weq(y{H)4)VXN{SZurWiXFWC#lcg2;sSy@?KdyL0r zlTIA*xnlZFuXd#FS3?Ywl5NST{NPnUS~|(KuAp8sXbMHIP%0IQFTL{FnHM)NYJpd) zhJjb9MnSn*Z3p-bboo`oa;;VAcF4%1yKY7u52;q{*W*@rT4*#*Yr*T_ycK_JM4$br z(F!X|?UPk{BX&@GxlwCG7LRH7YiFPQ1ZR?Sw7qKB48pkDyiiQW+>|W};zJuICT;GB z`*2XwZS^I(plNx{$PeR_MpPG@NqFw7<#j5OYY`k)@rj9nqqnyAD)LV|CFt{oxHCWU z>(=K$yUp`HI5(ysAMSik!a5eFCssystY3#0683+N`HXh?(I zkq>-eId?yY3I1}lt~X4t+zpGGzs2yriDlM&zpgjl0N-ji<~suKD~j1%moQIewxb;M zJ}ZGA*6RY_kkCJO!Q0`z;Ipd^sE6IG9MW5W!59PrANP-Xf_f?%UJe9b-%-Z$&%-S4Y73O@d z?=|W8z`wP9uS=%}%W)gh;poM2o0g-uH#!Mt*^&^CKX&qSr_2nSJM)foIBd)hyruf& u*p=}A9v(Yy5$=zwZ%TMG_~FCi|HFp-cpLoh=lu+8ceO?=|5rRZIsO57sDumv literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Arrow3d.vert.spv b/data/vulkan_shaders/Arrow3d.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..40b973242bc278794debf7cf80ce411b303e4eb8 GIT binary patch literal 1632 zcmZ9M+fEZv6oxl#rywAR$iWj%sp1Li0jMNKP@*XpO68dJ`U)n# zfN$U{c82C1E>_PD1Ra#_XcF-5qwu4Ln(l$MlS6GwJsRQ5yAZ9-iXPDDK;XhAJsq zUC<1JG-<_y_r2s;tY>-h8wTxOx0i_V)D7V{!e+o7;!#&CPy~xTTjNO(#c3ET=&8L& z&8;BTwN_WExT1Ni{X;ishRM4yNyCruw&x*?&0=*<2X2!#{Q}B(&f-43#1^06MeW!UAAex_1V_G0+R2xC@Q1!CG3N6= z=kyB>pZL3>9b0((fqlvN{gN=t`CFI%1RL&gMx0yPCnTH` z2fXo@E6DdKt~MJ7yeT0M?my7ZeR8MI%+Sq-^C!aC!s8#jm2sT!WIA_T-cO|)bM~sL zw?jXeAqzjh#PHtn#mxEl;qFVZ%w$2r9GTT~*)X4r5_mAS%MxbOkO%5s$vAix^$_=s zd{WnC2{tUpU6Brlt>dm{9Cw?FM67EP?qkn6GyfvLoL!fY8#a5Yj#}Wzle}(An8nvD zk2}(tA^a!VklS4e{H#2J?@7oBt|Z}{-Y}<%gu0m@F|dCqfp5x&x5ghlKH$m8*AC}; Zw=JDK@yYC}66Q(2u?J)GTUqQ%{s0wcajXCU literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Arrow3dOutline.frag.spv b/data/vulkan_shaders/Arrow3dOutline.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..cc851f1e70424a48e88d3b1f7082a36043719cf0 GIT binary patch literal 1552 zcmY+E+fNfg7{y0Q0lBD%+(fYjFDQy=0X0MsZ_7htHEMj^H0?q*w!6)4+kj8L_&@ui z@%*MUu@3om=A1d-Wxg3&7+D`T=A8a!%$^yHSu-MR%#<0kb5Q+M-O9Vot)1O%6c4CgJX;wk0I>+QUkoCIll(u&?kr@j1ZntiKhX)kGR z^pAJ;rNMVnb0ck~nZ-rbYfKj9uN@^#!CV&i?mb$jYb?RBY?fiB$yV#$jQ)7;# zp)N*IcBHSz>z4hWqyL=E>!=moOIhH~IAYhMw(d2p8G-U}jxi?qWq~F%pI5XozM)2m4(l{HT;tBti$M6h3Sds z@ShVVC;Yy{oDXhZcwTc!Mtz$OFE~s+i&|3;ub+5Jn(?I`{I6MF9}WD$*JWN$pU@M7 zede;PQmGtxye4eSj|1X!N7RCjdcpJ`j{W(@z=6r2n-Zl78DtfmpqyO~yxqR5W zDub^n0{vcb96W>C$$O}i(a#$)AA?>KhclOC?0I}kYkD`Wxa{AS5sR~zW%M1*Pu0f$ z9a%|+?xW*2w5A@0=k96^M=a0Xa~ySk(5X1rrVM}d>=XZmx<-%K^XGr4H5_~N3;ay^ uiLou?_YIzX?i%j5vOkq^C+N^H`2Tn!9lhtbj{BL`>~qaH{*QRp#P|!@b8{O2 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Arrow3dOutline.vert.spv b/data/vulkan_shaders/Arrow3dOutline.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..5a6101ae100278ce404f3245c956a27a6217625b GIT binary patch literal 1368 zcmY+DTW`}q5QUc{c1sJrPiHj_`c4Rvh?Gt~2 zf6EIJ=UaOvv(fC%IeT_yXV&R<_U4Sarr%BT!qj8cbcBsrG`?NK!Rg?ztR{!AUcW@K zWV%*}X4%YJzo+?plw^S0vR&B|Syw-FN1A$O!Gwb-91g?5*JwPQMrC!G#!;GNaWqMa zcw8kHF}nGdF3HB}Y|<8ZQnd4V#xvKIW15#qmE`sgp7Jh=`}TRLDtzk;npsp8qpUp3 zi*vD_<+VkLV$arh5hYm_XG(f0jc@j~_alu?;^KQ; zRPj$in;V|Np1Y!N=B%FFmRG3LO_q9f;;X4bwqz99S!dA`;_ zwy8UCe=zSGXy)sJ!?uJM8lU}bVe&W*{S9H_!oO`Wb-}F*FKG>A-0h&j%kmkVr*~+H z30~8Rmi)v6(-%16t!oWr4B~+|EUM3M%1290ZvSq>f#Dy>7!KDx{`G$VzG&#jzE;;m&OdJU;5iSj|Cjaso;CZNarvLiH|FZgk=~eI&}#-c{)pi_Bo=SO z|Bkbt#L~M}8U3cG@1&uRw`A~W=*O0f9?~Z?)OJS(?=<)1qoG$$b6-CEi87LNN5(mL zdPv`XD+haljJ#;x>*m}ukh%B|LdD zG3U&bscOgiK@@YaA-gR*uQ+%$kXNy_c9m2$GsbKAUc2qJ-uj)vz|V#!z0mJPap-rW zH0%tcQAphMSX>l$dU;ju9XieWBR zO?IHq5;raTKZpL@t&C$<;$F%;cgG3qSMA))$@0{Pdo(O6FlXyynEC(VieXk3x%lI? zz|^Aug5DTC8}?-w>o3Wl6jzrmE1$W+e8+WtPHTt58p5ZY55FQj?=bP}!e~-*!;p|c5<1A{L7ZthZgzZE3z^koro{)SpBO7 zn0Xr7H)Qmu{w?j~QlE1$dc&>i_S@RYC4PLBcukS_bU+;S?2lJI9QD9_CoJZr)N5C`j=L_OeyozaAs>#uC3n+t%<(}}Gxw&9 zeBwE${tKys2Aq}myCWZtGxPvIQ-5mQmGS=xo^!rSxL@l2REFln5yRqrKT#ao&dAXJ PjP|nEoa29s$EU_0aMf>k literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Arrow3dShadow.vert.spv b/data/vulkan_shaders/Arrow3dShadow.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..5a6101ae100278ce404f3245c956a27a6217625b GIT binary patch literal 1368 zcmY+DTW`}q5QUc{c1sJrPiHj_`c4Rvh?Gt~2 zf6EIJ=UaOvv(fC%IeT_yXV&R<_U4Sarr%BT!qj8cbcBsrG`?NK!Rg?ztR{!AUcW@K zWV%*}X4%YJzo+?plw^S0vR&B|Syw-FN1A$O!Gwb-91g?5*JwPQMrC!G#!;GNaWqMa zcw8kHF}nGdF3HB}Y|<8ZQnd4V#xvKIW15#qmE`sgp7Jh=`}TRLDtzk;npsp8qpUp3 zi*vD_<+VkLV$arh5hYm_XG(f0jc@j~_alu?;^KQ; zRPj$in;V|Np1Y!N=B%FFmRG3LO_q9f;;X4bwqz99S!dA`;_ zwy8UCe=zSGXy)sJ!?uJM8lU}bVe&W*{S9H_!oO`Wb-}F*FKG>A-0h&j%kmkVr*~+H z30~8Rmi)v6(-%16t!oWr4B~+|EUM3M%1290ZvSq>f#Dy>7!KDx{`G$VzG&#jzE;;m&OdJU;5iSj|Cjaso;CZNarvLiH|FZgk=~eI&}#-c{)pi_Bo=SO z|Bkbt#L~M}8U3cG@1&uRw`A~W=*O0f9?~Z?)OJS(?=<)1qoG$$b6-CEi87LNN5(mL zdPv`XD+haljJ#;x>*m}ukh%B|?GqV@4 z*y+635St;_?{eCq)pA%vu}gGVREl{o)+vd+yg1&R9CL2K6^eeLR4Nqj`73K{exv!R z8u-<)7WkF09;`IOc7R=f#xAU_R9ls-L9Z;bxskUi*Gg24>e_qtw?li&kC7L_dV*17 z+iwQzOHov>G-Q=?Bf{RiTZ%pLqldP?T5f#kV#kHO4Qu6U0?EpAH-x>sQ_{5hVqT*1 ztwxog`YH@Q3f&sx%&X z$oMUYEEd>iKh7cRhm7Bb$o#;%en}0UFzmjI%#O1G`yrxFJ7?z28I6lrCU<9&i_gnu zyjQn_oMVbX9{7FY`n2ao`xTFRkja_XZ@+dh=%8N2fOhosoLwf5D&BS}u)}{aH3GYl z%64DS4++PY_~?3?H>MDl6Lc@Yae z@}$V(oe^&{F#oH0cL~_qPCmbsT&(=L*~4|sO7fyyvS-ro)=Mz z)wUp>MZ87r_|lWrwk&?&=furnXj?y+`aPzQOD`G#6t{GW=P`+Rp!x0IOl!@}mb z5biF%oIl?|i-pYhEh`^SNlVqSQJqq91m05g&Vte_lNKv+*xT2DkY7H{rmtWbrQvxA^o%9_;Cz`-0wb zT^3L8*<3S{!Odn?{N{S*gn@ra&+dwN{J^P$nOqZ52lGPDTjpFArCrp1N5q@t-7Um? z^37NhkB;*r&Rr3)z^$fx;^~FD=?fV<)87|wdd`tJ1rhi+#eJatVT$pNe~!tk5Sv|YhnG9_yBwz#lu^-`=si&?+7NAu9*NrZgWsrrb+~R|pAAxnc zy}}w6Jt_KZg0$D}_KUB2xxq|;ftkcE~(#4>W$>CR9^=;i#-cU&*1dz@wC#omfq*cd_Bw_i#x80*W!9y4mx$V z>NN30&-s~MiB!N;wOTJybI#9jyai*XSE6#fbZ3fta|Pw%Zu>;kh0eXAbH3Bk?f!CJ z&o%Wy>8xqxG8=uIewNLTn5};3_+1d0AJ|qu?!MIz9lte^`GGz0%W9xz?0yrO9rFP8 zyQrY9CdKikSLWiFh-Lafrh1(>fwN!{kNacwWUPtN0~nkf*jbJZ$rghgn?bjI?!?Z2 zpS-{a6oX!n4@%05_lpk6pPtd_t6#sji-SRjrFR9{_Pc`)jy-i+i~&XBMMNhKw(K8} z-2w4_5o;*u2PIP%bsQ0=4r)Z_jM3RQ`yt8fllOIT^5BPlO1v%T<3VQ@!Pq|&WPI31 zXEtsBjUbbgeDJd()_!F@C*G%wlj8JlL_CNbQ{vQz4LQ)62{6v!l6b#}oa8{iETTvJ z3*y+48~t5zYzIZeLuZD}AGBPk6LYiUNZiDinl0E?UwHg$d&FR$JLb)At?z+!t@GHgNgzJ?h>!n9z|gsqO%eXsKMZ?=;_Rb8 z3K;o_^MlB_`xi&`Jy92P$|BF7LUQ8xGB5lcqE>X~lQ+9n=Z$XF<1ISxsO>Y`yrZTw z=e(onXBD5hJS}1d-6qfe+JW{p3<%pczX_Vn_m2>e&sFmLAr#vJ~k7!%^Gzh%$f z1rZp1W^&%o(6lh-?y`t)#^S#vnLVrTZOPR2lk!pTJ0dXbtY)yk6yNf|@#juvMa<(B z`BVRufQdD+s{w0k!L9|2`%<%gn`eC-o-6j5k2>fT+;QyhB z7~s^--GW)KA4{fJtMwDfU@XHvl?+C$R@Y~ev1N~Y$S8X^BkAN>4>jD9j6FCtFi*Ec z)Ig1&i?Fx8ijwJTUSxeGlEJO71%~#UFA1e+%UyJYqe;BZD0{%dJJz(ET1_zsv=bHGs$Z8yt zOr2oZ+L?bRc{A*7h@;!y_mam%vwC6pMjng6AXb}*xhL);arXZadPc+>#+-0|tR14$ zvfD1+8{}^Bok8Zzc8U1@_lVoOwpTK7(6QMcbgOZnbmCD1w&-@gha`iwp6_Al;Mfxj zomhN_Pl>3~6 z*!GKvNt|E8Sss&2jo8?oJSQ0(ViBudWIa4DIqRXzpW_SC!SL%4eJ=hsyV`uoH z|76KxY5| literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/BookmarkAboveText.frag.spv b/data/vulkan_shaders/BookmarkAboveText.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..04b6cfc60f74cce835258cd6c21c79d6fe142daf GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/BookmarkAboveTextBillboard.frag.spv b/data/vulkan_shaders/BookmarkAboveTextBillboard.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..04b6cfc60f74cce835258cd6c21c79d6fe142daf GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/BookmarkAnim.frag.spv b/data/vulkan_shaders/BookmarkAnim.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..04b6cfc60f74cce835258cd6c21c79d6fe142daf GIT binary patch literal 2456 zcmZ9N*-{fx5QdLTKtvQ5aKj~l8=|-Y?gF9)HD%nroQh<$Mni_mCVGVzzLS?ef_FZO zmZeqx-^_F}#i2T<`|rKaIfK_TvDLXP`rF~2xn%8jJ(8W?GqV@4 z*y+635St;_?{eCq)pA%vu}gGVREl{o)+vd+yg1&R9CL2K6^eeLR4Nqj`73K{exv!R z8u-<)7WkF09;`IOc7R=f#xAU_R9ls-L9Z;bxskUi*Gg24>e_qtw?li&kC7L_dV*17 z+iwQzOHov>G-Q=?Bf{RiTZ%pLqldP?T5f#kV#kHO4Qu6U0?EpAH-x>sQ_{5hVqT*1 ztwxog`YH@Q3f&sx%&X z$oMUYEEd>iKh7cRhm7Bb$o#;%en}0UFzmjI%#O1G`yrxFJ7?z28I6lrCU<9&i_gnu zyjQn_oMVbX9{7FY`n2ao`xTFRkja_XZ@+dh=%8N2fOhosoLwf5D&BS}u)}{aH3GYl z%64DS4++PY_~?3?H>MDl6Lc@Yae z@}$V(oe^&{F#oH0cL~_qPCmbsT&(=L*~4|sO7fyyvS-ro)=Mz z)wUp>MZ87r_|lWrwk&?&=furnXj?y+`aPzQOD`G#6t{GW=P`+Rp!x0IOl!@}mb z5biF%oIl?|i-pYhEh`^SNlVqSQJqq91m05g&Vte_lNKv+*xT2DkY7H{rmtWbrQvxA^o%9_;Cz`-0wb zT^3L8*<3S{!Odn?{N{S*gn@ra&+dwN{J^P$nOqZ52lGPDTjpFArCrp1N5q@t-7Um? z^37NhkB;*r&Rr3)z^$fx;^~FD=?fV<)87|wdd`tJ1rhi+#eJatVT$pNe~!tk5Sv|YhnG9_yBwz#lu^-`=si&?+7NAu9*NrZgWsrrb+~R|pAAxnc zy}}w6Jt_KZg0$D}_KUB2xxq|;ftkcE~(#4>W$>CR9^=;i#-cU&*1dz@wC#omfq*cd_Bw_i#x80*W!9y4mx$V z>NN30&-s~MiB!N;wOTJybI#9jyai*XSE6#fbZ3fta|Pw%Zu>;kh0eXAbH3Bk?f!CJ z&o%Wy>8xqxG8=uIewNLTn5};3_+1d0AJ|qu?!MIz9lte^`GGz0%W9xz?0yrO9rFP8 zyQrY9CdKikSLWiFh-Lafrh1(>fwN!{kNacwWUPtN0~nkf*jbJZ$rghgn?bjI?!?Z2 zpS-{a6oX!n4@%05_lpk6pPtd_t6#sji-SRjrFR9{_Pc`)jy-i+i~&XBMMNhKw(K8} z-2w4_5o;*u2PIP%bsQ0=4r)Z_jM3RQ`yt8fllOIT^5BPlO1v%T<3VQ@!Pq|&WPI31 zXEtsBjUbbgeDJd()_!F@C*G%wlj8JlL_CNbQ{vQz4LQ)62{6v!l6b#}oa8{iETTvJ z3*y+48~t5zYzIZeLuZD}AGBPk6LYiUNZiDinl0E?UwHg$d&FR$JLb)At?z+!t@GHgNgzJ?h>!n9z|gsqO%eXsKMZ?=;_Rb8 z3K;o_^MlB_`xi&`Jy92P$|BF7LUQ8xGB5lcqE>X~lQ+9n=Z$XF<1ISxsO>Y`yrZTw z=e(onXBD5hJS}1d-6qfe+JW{p3<%pczX_Vn_m2>e&sFmLAr#vJ~k7!%^Gzh%$f z1rZp1W^&%o(6lh-?y`t)#^S#vnLVrTZOPR2lk!pTJ0dXbtY)yk6yNf|@#juvMa<(B z`BVRufQdD+s{w0k!L9|2`%<%gn`eC-o-6j5k2>fT+;QyhB z7~s^--GW)KA4{fJtMwDfU@XHvl?+C$R@Y~ev1N~Y$S8X^BkAN>4>jD9j6FCtFi*Ec z)Ig1&i?Fx8ijwJTUSxeGlEJO71%~#UFA1e+%UyJYqe;BZD0{%dJJz(ET1_zsv=bHGs$Z8yt zOr2oZ+L?bRc{A*7h@;!y_mam%vwC6pMjng6AXb}*xhL);arXZadPc+>#+-0|tR14$ zvfD1+8{}^Bok8Zzc8U1@_lVoOwpTK7(6QMcbgOZnbmCD1w&-@gha`iwp6_Al;Mfxj zomhN_Pl>3~6 z*!GKvNt|E8Sss&2jo8?oJSQ0(ViBudWIa4DIqRXzpW_SC!SL%4eJ=hsyV`uoH z|76KxY5| literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/BookmarkAnimAboveText.frag.spv b/data/vulkan_shaders/BookmarkAnimAboveText.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..04b6cfc60f74cce835258cd6c21c79d6fe142daf GIT binary patch literal 2456 zcmZ9N*-{fx5QdLTKtvQ5aKj~l8=|-Y?gF9)HD%nroQh<$Mni_mCVGVzzLS?ef_FZO zmZeqx-^_F}#i2T<`|rKaIfK_TvDLXP`rF~2xn%8jJ(8W?GqV@4 z*y+635St;_?{eCq)pA%vu}gGVREl{o)+vd+yg1&R9CL2K6^eeLR4Nqj`73K{exv!R z8u-<)7WkF09;`IOc7R=f#xAU_R9ls-L9Z;bxskUi*Gg24>e_qtw?li&kC7L_dV*17 z+iwQzOHov>G-Q=?Bf{RiTZ%pLqldP?T5f#kV#kHO4Qu6U0?EpAH-x>sQ_{5hVqT*1 ztwxog`YH@Q3f&sx%&X z$oMUYEEd>iKh7cRhm7Bb$o#;%en}0UFzmjI%#O1G`yrxFJ7?z28I6lrCU<9&i_gnu zyjQn_oMVbX9{7FY`n2ao`xTFRkja_XZ@+dh=%8N2fOhosoLwf5D&BS}u)}{aH3GYl z%64DS4++PY_~?3?H>MDl6Lc@Yae z@}$V(oe^&{F#oH0cL~_qPCmbsT&(=L*~4|sO7fyyvS-ro)=Mz z)wUp>MZ87r_|lWrwk&?&=furnXj?y+`aPzQOD`G#6t{GW=P`+Rp!x0IOl!@}mb z5biF%oIl?|i-pYhEh`^SNlVqSQJqq91m05g&Vte_lNKv+*xT2DkY7H{rmtWbrQvxA^o%9_;Cz`-0wb zT^3L8*<3S{!Odn?{N{S*gn@ra&+dwN{J^P$nOqZ52lGPDTjpFArCrp1N5q@t-7Um? z^37NhkB;*r&Rr3)z^$fx;^~FD=?fV<)87|wdd`tJ1rhi+#eJatVT$pNe~!tk5Sv|YhnG9_yBwz#lu^-`=si&?+7NAu9*NrZgWsrrb+~R|pAAxnc zy}}w6Jt_KZg0$D}_KUB2xxq|;ftkcE~(#4>W$>CR9^=;i#-cU&*1dz@wC#omfq*cd_Bw_i#x80*W!9y4mx$V z>NN30&-s~MiB!N;wOTJybI#9jyai*XSE6#fbZ3fta|Pw%Zu>;kh0eXAbH3Bk?f!CJ z&o%Wy>8xqxG8=uIewNLTn5};3_+1d0AJ|qu?!MIz9lte^`GGz0%W9xz?0yrO9rFP8 zyQrY9CdKikSLWiFh-Lafrh1(>fwN!{kNacwWUPtN0~nkf*jbJZ$rghgn?bjI?!?Z2 zpS-{a6oX!n4@%05_lpk6pPtd_t6#sji-SRjrFR9{_Pc`)jy-i+i~&XBMMNhKw(K8} z-2w4_5o;*u2PIP%bsQ0=4r)Z_jM3RQ`yt8fllOIT^5BPlO1v%T<3VQ@!Pq|&WPI31 zXEtsBjUbbgeDJd()_!F@C*G%wlj8JlL_CNbQ{vQz4LQ)62{6v!l6b#}oa8{iETTvJ z3*y+48~t5zYzIZeLuZD}AGBPk6LYiUNZiDinl0E?UwHg$d&FR$JLb)At?z+!t@GHgNgzJ?h>!n9z|gsqO%eXsKMZ?=;_Rb8 z3K;o_^MlB_`xi&`Jy92P$|BF7LUQ8xGB5lcqE>X~lQ+9n=Z$XF<1ISxsO>Y`yrZTw z=e(onXBD5hJS}1d-6qfe+JW{p3<%pczX_Vn_m2>e&sFmLAr#vJ~k7!%^Gzh%$f z1rZp1W^&%o(6lh-?y`t)#^S#vnLVrTZOPR2lk!pTJ0dXbtY)yk6yNf|@#juvMa<(B z`BVRufQdD+s{w0k!L9|2`%<%gn`eC-o-6j5k2>fT+;QyhB z7~s^--GW)KA4{fJtMwDfU@XHvl?+C$R@Y~ev1N~Y$S8X^BkAN>4>jD9j6FCtFi*Ec z)Ig1&i?Fx8ijwJTUSxeGlEJO71%~#UFA1e+%UyJYqe;BZD0{%dJJz(ET1_zsv=bHGs$Z8yt zOr2oZ+L?bRc{A*7h@;!y_mam%vwC6pMjng6AXb}*xhL);arXZadPc+>#+-0|tR14$ zvfD1+8{}^Bok8Zzc8U1@_lVoOwpTK7(6QMcbgOZnbmCD1w&-@gha`iwp6_Al;Mfxj zomhN_Pl>3~6 z*!GKvNt|E8Sss&2jo8?oJSQ0(ViBudWIa4DIqRXzpW_SC!SL%4eJ=hsyV`uoH z|76KxY5| literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/BookmarkAnimAboveTextBillboard.frag.spv b/data/vulkan_shaders/BookmarkAnimAboveTextBillboard.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..04b6cfc60f74cce835258cd6c21c79d6fe142daf GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/BookmarkAnimBillboard.frag.spv b/data/vulkan_shaders/BookmarkAnimBillboard.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..04b6cfc60f74cce835258cd6c21c79d6fe142daf GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/BookmarkBillboard.frag.spv b/data/vulkan_shaders/BookmarkBillboard.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..04b6cfc60f74cce835258cd6c21c79d6fe142daf GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/CapJoin.frag.spv b/data/vulkan_shaders/CapJoin.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..cc3a878929db24f3dac854b3f3e35f1895a56694 GIT binary patch literal 2092 zcmZvcX-^YT6oxO90rQH?PI`PZ-V5bsPYEDd7*i*|ZgakfA z@~NNYgWz4h=r`+P(qYdnuND!q!(GR(QK}y2gQnUMlX6SiKW-msI^Cfz=$hVHrC17% z{nBT#Jt5D0nqIY5`NU}|;cU8f9^yMAo8PK5KGgE%`bnjBCh8(56K;B^wMw&EDr)Lh zi?d$vi&2j&aAltqb*W+B%)aIA*Yc;)5OV69xvr0asMNsUld2aWE_~dti*D`wZ}2HWE_~dbBV>lUB*RyrNrU) zQ(}J167H9Tv)R2c6J|OiVHuu|V2F35Cug=B+s1UW)Sp&9YNAg_>(-u;Oe#0MfvKO- z|6c8I2)IvsM~v5E%zeROAB=6}Am6Zdbn0Pe&iKL;59WJ>8yCK+JtJYw#du6Qy%K*- zJHF(^9@P^wry$nQj`4PotU$;?g=~hb$3NCja>B2BJQ^s-XF2t z8{d@W;$HY&Nn(CK!0Ym7=iA~gH(gzI=uPJNpJUgDh}RqKa)-z{I_^c^U|q_Z9q58 z?4L_`cZ(9{$a(SO9=K=h)a4!E!~OCdSa1Ax!fz=X@AQp?x6S)a&Sx#QS$}VZiG{aZ u8`7z1?_x8w(aYtzveJpgW_@i*x4!5boRyH5_qi*&}(A(6wRitji3huk1x@ z^|HQEAEA%an_B&U=bnuthxO;|{ofB~?{oGHl={X8ojahP5!Z6XI_CPMJNJeg@OyQ6 zb$N29)0mvPd;yQcuH+r@IU+Aszpx#rKE-9pi^4sjE^G-u3nl#!Gp%3!?x3qKN7Y)b zy1Wo=wA;~6=Xo=UnrSPE8fl(vbkf}fzo8z#w6)RfHhLY(^5{Lgta^^>jJVxyK3_?9 zv(8!`w{|wOeEaN{<)XsL&PMYbq@cmNUgPS$o_JEhAx^A?cHIn9f znmiLb=y~q08@2Q7DYrwklWoY``U=}?4HxzzCok5Gw(_joP8xbeJBz#9<1ZGy&cd}) z?ret~)VQEsRZA}Ww~eEg%yF}@54f6yt!A{6BsYFtFxNE z&}$cGF*hvU=b`p?oX6Wi|8AfDc%NREz8h_1%`Eq|Hl%k8eT}MkH|8vWjUkR*H`7;xCXT+~ar%!m|(fKa0-Z^ho zuzcv>3YXbT*BGg@V(~Ti`&!sEYSz^#lq(wF?{BUWsWWh)*Jf5KArDMvomvi zSDMcJJr4SH<)fx)fmykyQ@EF_fz!6fT?-t2n%@_Jquv#rP@GZ3?KcJH zXing4=Hr$C|A%~tzb)`b8GcsX(<_|ST9v#g)a1>5F9~pf)mz^k>DXCT^Iges_*u=% zlJUjHTmsIcp05RJ_%+n`jb!}csgJvdGynUN;jHI1$@I*;TF(z8!&}eml8J*SC+`Pm zIUaewm~qSTy|{ue`S(R9mbaz;YpS05e-Mre7iqz-a**k*g$F4+eFa|EDgH HnZ5r3tN#Pt literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/CirclePoint.frag.spv b/data/vulkan_shaders/CirclePoint.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..595b94cffcca15629aff8386b9c34b97c8633240 GIT binary patch literal 2344 zcmZvc>2A|N6orSTDWzrKcN)sRl&zGVwk&mlKqS_mmen|wA&ny^4$Chj#2fHHJOYoy z9}wpo&$I?H)$PnVbMD+_#;FWVt~X|#{x+G0DaJN4By7yM8L@Lve^H<6^_x@ES1+R2 zY${fWW{Vj$!PqoRo3H*)r(eod1pCD)8%&jEdG%9-lW;P zC`+PoML! zo275*N@{yNqQ2liRO}^#wEr@TI=xn!t%zDZlbg!JW!2q{o4P$8i=M6Wmx|i1!*vpl zSgn^k9E1y5v|JQSy@9xHltl!h-lzB#^}mci80`<+-W?Xt0MjEdwJZvgJEJOF)PIjB zE&Dge+u3S$g&${>{lNIm$^2Px|N7CZvL6_~&ob`^x8_&mMGw(^mw6rigZm*1++E^J zt@QDzjNx&ufELr!wcb>0|Gbu7mVLqaQqK@$AN;oq<4?`(@6fzX27k+8zHd16yELOGFZ2gBv&Wg}!Q4IEF5wBy z7~`zNHLblrwWH-s_L+~%TCLWs*IyPUzrEVOs+m~Sdsr*p5u7*nFmk)5nK)?34a{A^ zk=qT;6Eflx3w%>XEFYWS4F>1k){JjC*EwNhKF_lMP%C_WFTe|q+ozj&tTn#GD-Vwk z$oq*l&~aYfiQvc|%==*YUOltu(}NkkbaJCF4D$FXhWC#z_s(yf&yDxMZ=1*L^E+0? zCrcQ8;P4%t$NShV<83tL#k<(!ICutidF@`U%i4Xya2NyaH)TtI_RBa6&0SSO-f)~n zetb*3G4`kdJTKp)nkQw%smaiD-Z2^cS9ksi$MMcMgSz3o{*=~m9-nsD`=1d;1MlOW z)%xGK=fuH#&H4Xmro_SfvoC0kAH0u$QEPgzQC~Op=;zz^iw(rjFY*SXBQ|%u==RwQ9KN9#>^+i=%i!5xaNI9-<+_Y-0Ua6!zk%1J;|-6=_%1eT O_OUiO{@^f`< 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/ColoredSymbol.vert.spv b/data/vulkan_shaders/ColoredSymbol.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..5c668c18aad1673f5fef9cbbf3ffb716fd81d0f9 GIT binary patch literal 3392 zcmZ9OZC6`G5XZNK0Hvi5_Sq_i;zJe1_L$OEEQPi-RMF5vu~zN%nq2T=$c-VP53lMA z&+(;xBR_&4$2WTX|Mu=cn&tenGyk2Lot>RcC=5&vJ9j{TW9}E1kK=AYx^suzke@5d ztIN|no%(e7$|Wq0xPmvt=BTU~gTi*4Hj%Fg72$JXT}T8L3i`umMjwN2)K!+FO0`;9 zUW{t3RYnbXSgpZluR9ZPpsydaprI7QK5HmCrHl5w}{6=PT)M z)>&)E&7F;`y?t?aqddF4Q7+GJT%MJQ!*@(`3p1||>1;vYbHlEva|ZrF5;q>h4ZGLG zbu4;P_q&PGTEU&v{4~g)Xl{AA=xY;4t!yXlq?w9>?Ppqhc&n;v4|!Rt>qgsIJ!!0` z$y2ezo~L%*sMXH4s1DvvYa@PbAYXgs!1;O}lN;+so9(RIO6s~r+l$)m@t5`>D|4Y z^RrXb-JY{mv=99}E-;p)b6-Xb+d;QSy zdnuS7+`eC)7x#|cUxL|j=Wu@umC%3qa#rsCg1|6+B3Hf6yQUW8$U1Kv9e?86o#x*P z`yBRgxnIHC<$D(V_k)&vJnm>ee!+1^4E93q%?+L0EasME2DaQIaTq6*9eYjatkeVf zw4@=;CE<+hsT(@ADd}@WGaNW8{a}!7eKhFs*mE|EF`-C@gH9Z5SwAJaQ<_TxV=CyU zC6gCth-;`VuEH?VQz`%b&GyYbSyOObG58|O$0%tn?WAVuKD}gaCdwR)gO8ke? zsRKOz=zJeoZOG@5VDZqu6RcJ>$=F&x==2-hIc2?}nH=!%9j2d`<)#*}BcGpw5ghrT zr-4H!K7B}hy9<5?oO^L+MsJ0@=qCm?|A^s@<4fQ0yJ5MaFZStt|Jgb{_M}Ir-{PR( zP`pXWGXlMFU%PP5Yk||W$6XH`XEwV}14q6q+A-fV_s5=fdTc>)7c}1z=$m7$#8(2sqL@YmpESv z#KOkTR}H+TJ#Hm%>|d}Gbze_h#%^^T zt_!@gc>!N^?Ac>e^OleXomf8$z4yUC32=ZxO&^7Q`R&FZ8}5pn*dx)*n$;_lTnTGU z&FKFs(lvp%#J=RuI4oRM4BpIGkViEi3GyM$M+M&7an1JL_}I`PO4 zTXbrK?HK`%?{e&UUuOk)?1_cW8h3k6ARmi;UNZjH!*5820}N_rao?0o{-%#hCcgFa zTaxi-7*~=EM;z+E@*-u^PT7xxa=N#lhQI-~*0Z*e}9Oq?mf{63Nl|6A~z cmJEl#`F$+e{KyX-J3HT{u>PM;flTlH52Kk0TL1t6 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/ColoredSymbolBillboard.frag.spv b/data/vulkan_shaders/ColoredSymbolBillboard.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..9ddcd29ab6ed92053567fc290667e18cf3f5cb90 GIT binary patch literal 2552 zcmZvdYjYG;5Qa~#LOS+~<`XX~9odu_WjY8y9GiR<*%y2JHqz!VYHwY6Vht+jr)KR|2S z&nPRHDS9}7J-DE6D(`cY_4v(BE6#jg95)J{;;TX4&3T)e%H$5rqUJklTNSI zy-_S?ZXNFH2%r^S#?e4=)`v=%PIq&R-+2)}Cy*usabDL(bb@=hZ*BSM< z9}HT(ttWH`wNumS53{F({&2Is&WXfY&S8fy_qQz9>sVq7nD5zh8D+Nzt*1rf4f=Lw zK4RzP(cZC)LTJh|O@<8akHZS$TXktg>&ujtD;8}~aBan4xo55#@e(dIgjW%OypC+xYx z%wtz~@MQjORA=|N^c|s^_2#JU`r_lDX><)a!8-P-Z7((c&!FWL?Y-!+(!NsKo~fMv z{iV+u;rA@{AH(m=YlzR;(mo8f7xQ048*9FP^)Uo*J>p-@?dSQ<#hmbe1a^NX$-j=a zclUD&R7cB&RQI+7Zy$BU-nEwzIeWi>t|76O_D#gK?EMzn*lO>0uv2<=J@)ctZl`pV z$a`S(9-^&bFRrWYdn6Zm-+)v4>ED2cn8h(ynNrHmgnI&scQQTs@i^s zsn+&)YLK-dP+) zk*NI!SUzITfOp5d2`3-5-vXN_|8u#ox52Kd&wY7ja#8nPuyw0*K8r0MG4K6P%=>Wi zvGxMkJbBmgF381x&V%K`z5uqDS#E-7$xm7SJ{YIyk63=%^79D$B6hXbCG4WsOkQgd zdknFLxyBn4`?(Bu&%WPL^JB35EH~eNK0&PE9_-DU#<;h0X#M7TkNq9-{_69NYrB^3 z%vD6Lx|Y8+@=L7byM7y4M*Id;?^mPr#f(?5&6SV7KLguO-0i#IJBWPbHNocUi@rVw zM_=}>ZCv=jsQ6>8RXF+I*xNnySBRY7qCcte0PXWPbJ2Gnk@LGE{)dT*rx5_cK-53ozD7ytkO literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/ColoredSymbolBillboard.vert.spv b/data/vulkan_shaders/ColoredSymbolBillboard.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..5ffa225ab84dec058513eb520619d8f798b5d3a6 GIT binary patch literal 3944 zcmZ9Nd3zK^5XJ|VO~Orx+!_<`0MQ5-E+Y^w0~$>@#d9+3&c=b+opmn`4?<8u|M1aI zq#wbL<3IZN{(8ESA)TkT>wUYbx~jT+Qd+&QKL}RoZ)5OlkdMJ&wQvxu5Bl6ZHGOS* ztlg=OjUPRP#ipR-46)fPE5;g0JxUtr(~>VGbCSB`2gy@ONq_hp)6be|ihGxp-H`T(n$7gVxgYWKW#UnwwZU+!t&yyyS^pIT$ql zY8<7X<-S|RWwly6mNT)o38&e7QgQ43!LV@05{UDJL^<07n%k8qRk;pd*1ViY+4VCD zn^`;QB$+x~Rv)j*=Ek`holu|C1%qx_&#G~HGl}ns?RPx=?uN})c88AQ9cXR9t*y@2 zp6gA%p2y^ryWxB*>o()6PTuyS-%I>q@+k+`;Tj3;Z4-kYe6D%9CuMghqOc*8D9vs9 z-5rU-N|t7=>+${bS=Oq0|Gwa^jONpDHg4UFTb=kmKI8z;V9lCBz3|lQ_@vRfmOP}T zu3y|k26?eTGipU}V9vXU@2$XWTwLcq_wt`lqIkG}3a|CLt*`SK9(!uD7{uEkOg#2weWPE8AC=`MkJ*P<_+zt8w%aw2NEin_-XWb> zhIdOZdCWcsB|)%ohIR0pIsVh|TMonbyFAB)@xhKYbc=mPI)ges&`dn`qK*$Wuadw| zcs%X7VMXRG&=V8uA->ndQv){mg1K*S)O|zqh=lm$0=_9>;QxtcY^~>CNXM2vhzI6= z!Wo|P*y7E5JS_XW((TNMp9)haJpSOi=ghw)Ob*z8=htk1F!z@jyOiZ4&Ge3Zio@_8 zSuSV+JK{a|MsVy8Ui2K8_)jIpbN|JyKfG{EZ;!mVpA2mN5yLkFU+&puiRB9BJ72_n zUk!67`Mw%nFP-nJVeTs5SMVvt=RSNS;VxX!uGIap=QJ&GGoGUdW;g3O@}E^iVqTHp zk3H)LC1(|vJ8(ISvLVbA(k67I^3&<4$+=inLS zXSR{_If>ccmJWxIGrfMSeTh?%5DOctuj+YCOI++Z_OY64(y?WYH;GuyUrVRvd5P7W zNQbwY??@*GJT-H^a8^e{I(@L1ne>%0o8sUt<~P#ugC{0;1kPe~r4xg9VR`kW!(-pk z3`XbvP?P2JKsq^EUmr?`Lm2c1KkgZ8Cv}TCyKf~!5^^Cvaj_vM-pKcox`g|IKNuhO zUC{hQvgk4Kew55fERUZ&2hSjnTiO}hpC$NX!`V|0d+_dAv)Z0X=YFyFR5SQrMLHqj ztrCkG7@H)=WjCOCv)6flTfENO8}#}{&08hB?H4rjwprgMA*Q|c;T8CR$MgvMof7ui zAtC2J&ATMao2CbNHAI^389dwLCLH6M~r46FIDbU1`TURL7~>DU%~{*EyGtn%X0q*HG(-}i*!E#Fhp z;SkIBv~*&zX0axv6YGq`YB(!>Qu3Rx^PF^i;jM=A(%~7#U62k}tm~pMwyg1Pk;neb Q-`Z1FY#pXa&*E}rVoZDmeHtIZ z$MMF*|2y3^wjNS*>i=swb?Ovd8ay%L+<^XexTh{#yWOC$bK70n??Lr>b*9~E%v`^5 z8IPT=9S!ko)O#h2Vk@h=~)D0|uKf;x92 zX++Iear92?i0A2DH{48-^>fnwZn&N%-OZ?> z7qPSGL7%^p)jkc^ib>Iy>hCk7z1~gJsMT4`xUzq%UiiA!T&qT{_0H>zA9B~FG~%_j z3=jMF?1f8dZGF*qH_)BwEh|v((5F25izkJ-FTOhqHs<75AD0|`W|0TImi}?pR#${YA{G@VnF8YMD zvi6E(zw%Qbm>Mej-J%^1IjH}zZQ8NZgW@uLSoyZgfFJRrxf9&o9NX-0-Y)UvqZa&m z3v$8Z4`ycIu>IcO>7x zeVa3USJ=5v4-DV;xH50}fyY_?CF#_{oj4yHReZ?~$d?%O%d!rQOv6#T{|_`uJp0?vc8c)kzJg2f+{ z&Ma8`A?f(QKT}Tn$9DssMNVplTacYQ9G7qoGeTZsDiV0ZlhTR%lINU~UXj2rDB`U4 zbCPKZ@6Y^M?0M% zya&AHnU&7`F=JNWP3iE4Z%HTabAH#`((!>OCvOU8{`aKAea-#nq{A_nqna9Oo0m`< zcgD_)GRJ0LkdB>mnRjgS66?=H>DC`RcTpU?_4Sc-IC5FsW9b%0?O^=K!MrW!c5Fe8 Jf2)#Pl0WzKrjY;u literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/DashedLine.vert.spv b/data/vulkan_shaders/DashedLine.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..9558df43ff84fb34228fe92cb01e0ea06a894f06 GIT binary patch literal 5380 zcmZve`FmVt6~}KoNxHLjMWiHD6fIT?p}-ScXrZP^G=UcIL2)u>X3~L4W}KPCwrXvG z3T_Arg1F&Q_kF<)YP6!i`ro)bk3N1r_udmO^YHfh_C4o&miN5po_i;yl{;1?$qN2$ zNdBH=>*8c3dXlV5hSGg};_$?-Zm+s)^oDEoxF9K|j{00koNEBgRT}fk4}dE89C!vi z3%(4_f|o#vf5z_Nzky_JGColrpPU?@I9Q%(x69q$@n)^uY|Pin)kdc_(`zi&^jlr< zYs}9y7pg^vK|G2z3{w3?oKb1Fo5!abi>=;~PG!DZZ*}IbUaXIf&DBRo$LhPsa7m2y z7H!>9eTX~e`f`|lgWNag@2*vv_seZaE`^(^G-oELdD*>I-G8jnooaPC?z%CteB>Z~ z-AqiY)0l0{SDLwFntuy?_h_Tut5u23&fE$&*Q(Z<_cm%DLAH)<>_;oj`hAUR?`X=c zN-ksX#Vv`?uY-3fxg1*-TS~liJB=wN2ibjA_Tc^O^E9Z^%+ByRR?5L-+%#POxifHu zbK^Q`o#w8T+pTV+*Jv>v*76|SJqIS~!cZ!sCJW_PZ#a~!N_l5wq1^7Y9&`$fPKa2Y z+E!+^*F4zFp5=5x7s|7p)K*4J039Z&x~%xm-Wl zr+=bPf4EOSgT63XuXk%b@(rc$LZv)c={|I%cI>uRt3zYteLohZIudEGe+EzY)3g47JliZ!)jIdqI=$L4)U+@1E^YCkd^gWL_a~9*&jk^^@F1h|V=cyQ{ZrmvladNN5Wp$O{^jiYq=Zwky1B~bMZmf58 z)~*Du&_^;g)%|AL3-fAsKB713&V_p9a~{;allHT@uHAa#*{(x(1*gAU7FSCBjM+$L z_Yo?v2IVbCL+ry~D`(gPb?-UM|Et;M#5VLbxg7Sjxh}82=SGeZGOf>b^XRMHb1q@` z9BVLcBfD|(BS@QaSzbi!W_<0*FmUb6^(&CQleu@Yn_E5X*CTtDy0*Q*75ctZJ9Wz@ zye5#X=>zO5QlEtHYNk8ia-mmqeLFQf%l07&T{d2Jl|(`w!>~OUd-*=$?u$7d(`tsWPRn$ub%zw zk@d#-mx2AVzE{}wH^&~{8+qr~CI2rNzYpee*8HuEUOBJR1zr10pYHET_-j8|(4AX< zPr`1#hx_z11>N_=?|S&FpDXC*TPo=0JD=-&sedQ(2Z3`sNfw_;Ip^eEK9_ym+ zPQMC}TTiF$^@o7I2Y@zXrrG7=tQxZKK%7-amJ=@H@1ncrn+4ik!5u}G({GA;y>|oX ztIavy2lkW0cfh}Gd~bX=tiku;!$AH?e2nh^bI3Xw<&*6CM}JNs_xI;CoV@Z7l< zX#Y3&j{Cbu9gidT*YPPh`FKvBMt%&)$IN{O+1@yF+Rf+p=tk1ILzKtwDMV!y-JHS|Z@8|bcE^>Sq z`2kR@=X>b#(fjWs+bjE~EzbG@@-&FLe~7HFeB}QTa)16G!^ubfpCFrm0BDQae~N5Q z?bd#lUC#5p+s}dX7H9nexeAJR`6ar1d{=&jY@92&Un9#|Lwsv~gRHMMb2uNK=)$n zI`#{J-?)p}{hieJGGHEceJ;=SxceK?&1Vhzs#~MJ!$7V$(<3>rzq!<-FIOU4PvqW# zYks|S$mWl^cnh-euHddlmNQSx%3G23)n-ofJeBwIZOGQB z&m`U1$$kxx7cO&^K-}T&$k`p%q6ZNNEv1AF|vHijH?Xr6<)ZXKTWPGG)xwzuRQ+cI}+&J~~c zemH%#?FD`t%;|UF0I;t34%~*UzkJN(?a1=NWp4Xqz1pI_cOlD#K8|cJ9^si;{~@4{ zyz$;oF8uF6mJ9vex&Czi%;63HE>F3-X20ptd@;er;?&fSA-er?W-y60O*ocBIt&)2T3-P%`h N2hYDhx4AoS{|C&B3X1>$ literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/DebugRect.frag.spv b/data/vulkan_shaders/DebugRect.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..306ef6b22b863850cc41141ffa673ee69c91bbca GIT binary patch literal 992 zcmYk4$#2t85XPrTUAj26^GJ-Dv;P}4pDOe#L==6H?nZ-$d04Zzr2@L z{eE7MUo@GSZ@yXHJhxj%kId%uTeYs0XWd%z%~ouo&~EQ%?>L(dk5Asch4IAN1rg3u zapt9wu^+|+)+KA=fT_5wc2Vb43G=pWZqIZ3eYf}B8%!o%HvJa`UKGZGHw@EYFb!t` zyu}7Dj0aIZY!VzXnmrv&yP{s1KhE-ab{y z;RUg`Wi3c|BsNB@h`U`SW~Qe}e^Uz4U5@$<^(eqe|CXNSb#Zb;J;3@$!* z1KX0nCEbzCN#0ccwrmdh&!yo~Z&#BXNHZ(^=BfRC^?#uNJo4+EgV7(q-W~nwJ(%5m zJJq|;i#>3-&#e$gnq2PBTQkdNq0F``;Xcg#Q5<4>67Wx|03ZK@_{8=le6!%h*&EoM gZuDNl4DjG^*!`J!^yd3zp2yO4uhj~_7miJh2dr*Wu>b%7 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/DebugRect.vert.spv b/data/vulkan_shaders/DebugRect.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..e1824debce8624c3dbcb5035bf9ca85570575d50 GIT binary patch literal 920 zcmYk3TT8=05QW#a@qWMGD6KvU;)9AHDvA;x3ROg3gS1f=Vp7s5>XSd)7s2ywlF|v2 zojH4U=Im^>vO8wXh`t%KZE{;M73IcEnNhd;t%ufrKkM!v9v#4#HC0E1GiP*MR+GOy z+n9J#J}0m0gLAB3O{m`r{C3-K-2|OpFX(4qQ5Zxv4uh^u!%k*DLU`jtJR5hS_wF#k z6JxlSCynFk@frnpVfqxNS@@|`XpR%Jm-KCBlUV4Olf+NiW(lPak)9 z4tnKLx4$mz@v5ylo*~BGgH949sXMbt9^02Bee1J#D-?a$RK5%_G=Q=C>J6{r;+pGS zSBz1k?6sRijt^Gy>AN%7s~PfUkuQk_ujyVSKeMWMR9Hj4rit>3;M^Od=C2S>>zPpW&CAhtFBBb11*Tv9d-&-z z_+n#{4j-x2{hlv%H`F&XU}1B9RwJ3k?i5k6W%vNHb zs3x;u6(lG6cerNRe>uJvdT@EvPUnHidoFRc;Qr5}-*g_Byzdg12X~$~?Tb4h?x)1X zaUXEMB%IUTE%V}DsuGsNl_|8b`!hRl-$nWk?k2u9O_yFOs?Gk`8?uVhWyz-Yp-(Wq zl=WYdhC{&f(wPK5Nig>hx2>;YQJQ>kdO5tK{g&h)j(W>U5FGWu?mMBMOTyHnSK`;C zsRd6wnC}B_OL$wFUg>{V7Bhr%l0M6hcO)+2P-lE=ySW z)0kc>;;BXd&VOAt`S@>0(+_^|9cg@U^aJMY!I4kgJ&7^jULNYJqc-Pc5%XIN-y*r( z8*h|aPleIEMegdEqVa+8F?-${a|biqbqRBQuZrYuNQi-V^>~NW`H{r%7U76>d%zv3 zb7oPMFkfa^mQaT?)g<_iREL?|lu(yhxtRTgXD@PYN#MwJdADV|JoX0@=lbOx;K#>Y L!GBD~JeK?g+3$9r literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/HatchingArea.vert.spv b/data/vulkan_shaders/HatchingArea.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..94e222ebccb0f6ab1b1c034d7a5d32d2af06c418 GIT binary patch literal 3136 zcmZ9OYj+b>6owB;(-yP{A~(^RQdG2BVHpY-DJ>UMAeur;#p^IlCalpUla(97C%(9r zAN3#k6Z|=T(dGNhoE<|BYxnH;-Iue^KD$Hnx#c zSNns;YU$DiJPx~j>WI&4@?y$G2c7y)lSt|-!aVH8IaWAS5;!%X({DfcJskerWNr!?wCeJRYo+COV>~>qvw&PJU z*zJX#elzK{&ySj=a=Te7m75pKa&g2iXz${d;#u9z<8c^%1>Mv052CR3E!>=YUEIL3 zM~(C}QL^RT8`__G{ZsATq@U)YH(?+Y58_1K!uNA=4{y}e?b%cpbi<&XG@{mC96c2~ zm-6&(7<7BdPjrW9C)<2#%VoBgE}Yr3oV?gDc+yLT-Ke2gw6o~ln7^3abseq~)3ZJ~ z3i7_A{Yfj>j(U4hZxHWkZkFv;pLQlnbR*;I*S%ZKPKbA#BE3{7u<9lZ#x+WChmpA;^6*|%j(LD z!|zXt`SIRxe@QBS_K4-Ky!%-R%kWYL(|CL9>^DBkY3~e2?c{{Za^}--04d1F+gUI1 zy zsGsxN;gD0p2fc3gLmtE9&)qG@k}|#OF?sOCeq4UXwHGC<6^~Cyr!MMvQ#*A~Bbavr zV>ka5>DW29r2T*dzp}^7D;)mBUY0ob;`*X0WLBx!#O_G0YvRd^54phWo}>2b(u)$y z4c?Hjh~LysJh?d=`)vvSi^6xbTaWO+E6ly%IS+i#a~59}Ca2xyOX)1)A8IF_oWz5f zFSygH;*oal&-s(f@ELi2BLjZq(K%N5UQ8*^7ZM~&w9ndhi)TN$%6vUvQlGh>^|yQ%$#gt^&}a5nRBQv(0He2Bj# zDNEoj?hEO}F*6odkq&QhThfVzUsspt2^{|9tx4dp(I2qozn}8XF;kZRf%J^er~LyH zOYfMqtNy;b(vL{UNuRNkmzmp>Ft-~LV!`-x2D8L>i#Y-_8-awmdE|3HmW~g6PQtn5 zVU{0DEUqEFF2T019sG}`>57E;;r`Uf;`?)1e$2^&*O`&SUS~e|dxjZ1s@-Oczh}q; z#)rRQz|_EgOhP_tz!yv(@I5Jk<9mibGj>V>k3YG<*qDja66&$sXQUHf(@FH{EeRaL zVkRx`+tR7u@S=3`+swWrop_dUMd@(lu{mCnj&D&yPV)TWdwEtmHR4lKCzrLKlfWY^ za^)ppfvO;$|fLKIbI##(Id4_3(Y^(>**d4&LtifpqTro3fGTLkT|c rmgghsD^IGaE;Dv%1&+uftwz?cEOa7YB{$(`U>)Hu0J?{ldnKn4H~9<=5rqcBi(y zy0(JHxEZjH_)M4~lhKYGR)Qvm5lKPvP;y$n*mQ`r0h@1Kff+MwN@cIKw^u5^^s23v z*Y133_+BGu`d%%F{AwrY`S=Z`{DNk+(XFK&vhqlu4L+r_s$nCHw1cUq=fzA`HH-_t zeYU6Wa#j~KUGFfg`Hgph|55Cq<>{~MwW9C?)r7XUoa!OIKeh$Eu=6IWG~4wsIuv!1 zlL>Xb{V43V{F6{x0=pH6wA&fD~=1mYdUF?M9K`?7WY;oSkXUJE%13Wxu)K zIf(g;S&&i->h&0B?c96btEjU7+)kmSo|y>?oq4cI$!s`_g>5ue&8}?p$;wK0_3d!c zvj1}2FMYT;W|xiw6SpmKx#0efW3K5qFmXo`7YFw@F0PAtf625{$uC$;A#%jGND@bT=P&F8=}WZm#Rn;mGCU9!Pg_)DFgv9Nano71*)y*1*42 H$%f<)z?6dB literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Line.vert.spv b/data/vulkan_shaders/Line.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..813e75b21e8b7dba961e062e0835b3896a97c53e GIT binary patch literal 4984 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/MaskedTexturingBillboard.frag.spv b/data/vulkan_shaders/MaskedTexturingBillboard.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..97fe88490cb693265c1d73b3e37fc519904cdde1 GIT binary patch literal 1732 zcmZ9MNpBND5QRH&ypTW^LN)@y3wywT1Q8Mf5dv`zmV6+8F+ z;Mo5HRueo->d+r`)-*HV@{(F_ z_F=uQRY7xEwxN2Q2cJF5`YmY&!?yG_%xfl2&)MPpZPi;)03P}0Qxe#-)OT-%{g#AN zkF&r>duoBh$LEcJxqSCVT%5ZnzA64?&776~%#r`@*3XK6-+!$w#-c zjM}@Ye@$z&BVN{wF^HEnS8z0_U)4-4`g8FcT9Z%wre@AV9Di3cF)+@9&;5as53epW z=G*H%y)J6gCj-uJA-p+qxi|iIQR}&U^yj-ndwlf0C_~#1%7V8lg9Gkz_{PxNYs&D!2hbz-tsotT)c9-8b_4^PUTI76BnSZ27-Z85y! ziCxKUHU4T8CLia%+r*{SYAcd6v33Y2>3m$y*8APCaN81y@`OZXw)-@<%3-48X84lk z)jUdBO~as(w&Hf2s>&tR@tSOIoSoGz^<}!CTL@}tB}#6_(LJ&K8Be_zf<`mFLq+j+ zS{umLdh)e3waM4>nB4S2FyBlU8c{{JZ+lVi75)(Ul-v!tdQ5p+#GnSBYF@2LDeH?c zsLLcwa+^LkFJ(Rn=A!1!sM(J0!?O=OgEc!iXM*QU86Vf%*WyLWmequwW3V@Y8euc6 zdHkRYf8B+@S%dqt-t7eCG)bG+qxd$&Q{NJ^{tk*k1Eo|Lgbt~yS^ncjJ zPb*K}3%$X(D9pVwN|KBEH9VHFYq@@L^r-n!m!cmSzbT2ug6sC94~l+Z{FWr<2e;~% z=S6>D_ou|{=nc5PB-6f6@#U=a$Q}v9@MsP*%y)xYkR$Q9YsO$ct#GWvF|!ADw#Oss zR!{bL?6Ivcdz|~O&+Y|#&az!mup1Quqwkc~r+GxOOYx`ym~)QkcR({7vRinA*KK{H z$MD#bx5XeHUr^$)7wen+I{c_CH+#%J#KIq&9kSi2c|^k4@9{3_#4`M>bj|{1pZyZ& zmQEW!kmElLzn)>|4rp)k9GBpO9c$&Le$CjEB4@|EW{mUK?Ykgii zxsWgMzR*nG@c4sc&)NQbSlJW%R5P*jdgu8yh3y`=x0biTp8q%a+I|nEV{7&J!DGuG zOrK+8=b_Kp6U_Ruq`3aXuiHKUEbQFk`J;Mg>`lKi@cCN|-veUNcb6pOVwmrG5%aAz zOpo%dH9RPtZ>?c^mv1fjq~bHbC!tqnwHtl%zUSZ>oQoWm6( zIeh1|6MJ2i;Ez4)^z#|TrDr~p&}Z}#xzRuR_nq;-$p-&VB*cI}rD{ z4!1m~X@v_tN3NFFZRxiptntne%c~-tyvh>GE0PXxc~zwo1D?FNBRH$^9qHt1G4D$6 zj+uyqx0p5Q_`%~xUpFM&72g$Nb01$y;Lixr%L@`>)ARJX*>$9|_SoO!J?Z$ulQVt9 zo|faHbmH)~?A%{ThsT~i1EbSp#Iy5$E1eq5>ejfI?<8;tgWBUqFS2$*y~q77Nw!PK zh4{q9hMXR1{$3JG=n?$EOA_{FpC2W>Mb;j9Y->LW^A1^C)(rkfnH-n!4%wf*8Ji`? zWXJm(@;Yy8i`NG=Z}s{n&D$ir+ov`2PFdd}A*Q|C;V!(-W6p;CZV7wsl8`fZ`-}wM zY@U;jP4WJp7lwc0@AU=g_`!2l@_-}e2F))@I0u;gMkK_vyBhTzJcGNkeD+A^+?LOn z^zM9K5(jT@@MY=5WEl5~bU0$$8+=tdwyd!aaenvrvR68JW5b!KC7hkquPAt|e z)|7N&otD@c&Pbn<{OZqnRyw}$c7}7(;TguAmkw7v*9Bp0S>v0FJoI<|j&#nA&A)nE HVBYF~bs|j= literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/MyPosition.frag.spv b/data/vulkan_shaders/MyPosition.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..e89368439dd28f01f730f484c3be00d67c7badaa GIT binary patch literal 1496 zcmZ9MTW`}q5QUdqOAEbF+ENN77bqa43M8nI5QtL1eTb9?3Org->{dpO9XWBhJn_Q+ z;wSKPctPTPwl_5_n#`UvXJ%(-U8 zd5B`!R5Kx(71J~|d2BQYA_8l&J=v;s@H#-dYF6t&Nj0-*oSy6S`%dqTI~rmt7%_F-%$U?2LY(+t z;F?*FvpIJZ$B8$QOtGrjkbnQGuiH1WJ$&kpV$Tmh1pa5S&5Y;%sXI>MPjnn-cWYibdKA?^o(}76yv>i3w*3x`e)T;$NIIno3a0LyzOeH%k!vT&I6P8 zQf6zx{h!CY%6VY&zRPSL+<9K!7js1SQ)YF{5bl?ZyW00)F3hqcV_DqJVTSo`?JU;y zik#V24bEY|sa-?9CEHRx`T=uhOTP>9aM-rK#zlGJ+_}6g-ch|J1<;XysSv?EE3kc6 z&RY>rJ$gaU?5PEh9?W~fT@$`4PcQVhs~xj|vu1mx)~0ysqM;U;dF5P9^*A%H{XlW> zwv5^v`n@jSlCg+`cVzTJ{TuSsqJJB|r9HDH-jb&u;@~^-#Ng-$yjO7Kqq`?F=G*H7 zeLd8s7Z!QH#qdp$%e(M@1GSzDGhhA&m@Sz3U6C=nkIF)~E<*$VLKVq}JJiYC<))1J zFaz#M9eU#XA$F)bE%~;LT<&T$or3=%4LMyI9Jw~{w)QrU^TFt-L4S9PI5Fk|{-bF> GmHh?Lwr>Og literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/MyPosition.vert.spv b/data/vulkan_shaders/MyPosition.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..46d27af92234797fe826bb397fa8338ca2444cb4 GIT binary patch literal 3724 zcmZvedsmcI6vmIt1?1vgG%Et>Vqv69M2)v3gSi?>Z^y*D$ju4WxNPcy%s6r=KT96c7>?Rk3D%vWp4 zBf63Jo@Uh#V!GP47Y-+l-`op-?P_GoGxU5UWt(Ef& zQEfS@HKGkcUn@Khwxk~WZRraj-IJSxo7$>|02vuSahqcaXn z+zpAv!R?LX?mOea#BEC~4sJKDT^BQf-(M2*V;nCJ(;YkIV14)?o?HSipnQsf#*JX{8Qo1k+P6cJm*T zj(tcw(r0Qgv6`vrV(`OfDq!w{SZcYXby%`bLT>P7iJkF^bbQ(0>@(7N!0@*{+O^LL zcjo&-m>lLm@BO#0pH=PDx*#D3f{oSox+|S?o9|+Urz#mCCGrx`4uIY4~1>SO9lm4tp=ouR9_1wTaYjO&VEirjC(_CFG@SKQ>2PNM%* z%?aZJzjv?C#jzLf3VVU^w_5Ia-8tSJ>|ov#vo8fZ?+149VzBcrd?}%)*r|`ReneH%Dpt{Cmw(7yw}vudzqI|8-1oW z-q8mV_&?-Btpy1=9!NMJ^9+aoDXo!&_t$DD1y0Kjw-z{RwYnZk#}}L33Heuqv01Mk zNr$ugevm#bvHJ916NeAH#qj?F>U%ae#s^I^=KUkdau?4LGROgP{KFxuvWf#_#Tmv z$G(Bb0=9l06(%1w;0vaH@|}>t4NCB5zE4Wv@h2D9diIKR>apCfN+*6^6>#3yByb21 zGiG^TmrnhLhoqC=X7vr}#Pb+8EFG?MR!4;K9hQ)jJb#8>o|aCH_}KgWrgV6Ohg>O% zo#8F%?KAB6eSBLOj<~cWBk7XR8|xuH*28zC@9p6kaqxE5ccpXI-<6F#?@921w>)R1 olV?m~aqmlq|1HFgONS%g;y#dWanuLK&(3!)*#FZh(3!pe0oo-g4FCWD literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/PathSymbol.frag.spv b/data/vulkan_shaders/PathSymbol.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..8415d1742c075c8fdff7cdcc58ddad8ac343833a GIT binary patch literal 1496 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 A@Bjb+ literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Route.vert.spv b/data/vulkan_shaders/Route.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..f93b5cf6444eb07ef169d5391c619d65985ff364 GIT binary patch literal 5504 zcmZve`FCAa6~}M;l5~bbM?^|W9nfl}PztQrLJKujqY0G3h1SP2?BxuZT8XRC9$kN?xP=8Vc= zNZ|v}Dd;rxEOZ8{@Mqj^{`F-mv*D5I@aX99$bss3r&FEn9ceYHt>#RlT5on6gNNoNxE;?AB&xC)(ZVtLG za|oBr*fsEuZn-|d`I5d6re8m2P52#+TI*i1HQ8lg%FNQTb5l8@5L#JPshQ#l3jtVh^=HEx|7FLvIFpXE-%a84KKw9+6pHjU1RSf1OK7Pbp6sIV8YPT5?w z+n(z+#%kT#G%X>vKacgk=c?oFR=c}ULw}A<*JdBMHQ_~`fgC4|gH@OoVih^7r|DIP&+Kj#;$zflabaDONH*#zxlV2uv^XRMHeJ+K&k2Mz8d0R;2Yw7MCJ+ z1HSfP5OQr#`jyC@$=uuF=2j2;b;$0eu5AzG3Vm;`9lLowUL(lX^d9(<+$ZCmUFbd^ zVp}-LINWmwS^vwCx$4;5-xzbLJ1=6MX#ze775f$XB)ZG^DY(Aw6}31|;crjckW2p# zT$^WApHI5|HD2BMi+J}x2H7+HkHg*1_~_x2$ogyl4!r1Zkx$+EjreDhY(Lyj-FXiC zkCDw4c6H}l%>AtAg`{smch>cd^ZX9kT;k?eKa;SCe-Yg?#2x_ zJpTgeM>m)A=C?R%Q}?@2)*oJ^pID^({Rn?&_hd=;8SwiNcApKu1!etgNjLsnNjLs{ z()UoW^Zs7Q*&HQ{cU(=FxXZrY&I#?`eUNrnU^Qeh{l>^)E$@TwgS72|_Cou};Vd>G z=XVma2IumANc?epjDG+!hj`T0O1L(c`|af>?YB1bJG<|PoNs5^{MOxt#KUJ6S)c2m z@bUMf_!xQY!yIIsxchjIV)|?ML+f)8`jMnRMZ9|+h4c}B9&7~uK}g)5{F9sy!Cn6$ zr?wA4V$PIuijymwnx+KeFNE8 zaqr8sJPo<0w%GHV$cvwYZ-I%&bMS5Cry+5B=W`(TZ_XHJm8(Al_w4ex>+d2P6KD7y za-5<3{Cyu>TfA3(fNZQQupc6eIa6bt${GFFe)=f=BMLpR{J9KI&WE8!OvKiYP@Lh7$i*2}`nAgpXlM6kQevx8ZhxV>rQ0P`WV^Fb1kHg zc;wlIY@YJ-bUnIwysvg6iy0qrHy}rx^{ML@=esf4|HmnmWA-jZz6^4$hn&52@C_w- zW0IZ2O-XicHbc(gE8y{aZU{N%&^!l{ZXNFRX2^VTw>KvYwt(G|u=0KH1JhUA9>{lt zIeic8hpa2!1GggUFCH^_8?w0MGPixQUTsm|Tad*~YNyZlaSdna@cWUrMY_ZYIZg?>A-d;5FBTJL~7 zrC?Sy?uyJaAp0Q!eJ3Q&ErWbCp%EvbI)Pee7-S z?0BvAySneygQoA*g2>-&2fIFby_vkAxmoYjvI%)*Wbe(pygQ(~wt{B0z8u!W$O*~o zWzKcHO@IymEm$$`ad!_}4#TL{Qkr5pcU1fHhiiI$AwGk5yhd2_>n{TTjnHC@^Zt&v z6NRtnIE>$3P|wtNC$V5RY;Q!>W@{^q8iMv}QLy7hVW;h{SEFi!%L}@lTHciQD=g_D zA7hPb>vi%l>!A?iqCvd$%~pf%9dBEg?D#cJ&hXwWel5{x6s#H0W~xIzp5dyTLxo3VBa$s{9p)We9Q!F zP#D_TH-yg2W`zxzpS%qJFG8{H;juTr=9aLo#>+^8x}8fO!Itz= zG&v(fXS75wc<71mlGu`XO4`R|)S{W?Or-cncM5#m{Hr#(O~+ z_$TqA`z0CJlja&)}G@Z$Po#9~_Hm|dB8@7;QXs|BD&}>mgJ^94pwr_}->9V9VeGn^a$N!_w H@5ufFj;*24 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/RouteArrow.vert.spv b/data/vulkan_shaders/RouteArrow.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..391df7ae5ed235224076f044476a469e1a97ffe3 GIT binary patch literal 4788 zcmZve>2?%V5XU>2Ou`oSO%X`I1w|1sY$pZ?i-Q_X*gc>Q?MzS7Fqs)=iGW)GL2yA( z+yz7t^#%OwBlrkDg5O-u(c}NueJeC`xSYzZ`qy%+>Q>(&)w;aH^IG(;)BD+r*DSA9 zvgb|p+M_))uy3)Ly|XlG|06lPBD;ORGkQ z?+N_kA+S#G9$`7Zm>W>e6Xrp_|9Ds%D%W(}+Foel$h3MnPd?>pI2@MzqBD%*&lg@B z2@CZgFW>mg1;R$l`Ji|p3|s*+8l{jqB9*8&6y#@1 zg8X8PwRsIOASRy?Q=tIu%-h)}`COBH;SRYY`hLdZTK5IVx0lP+ygR=m`mX%D>QdfE z#L*xzb6<-eE@p><>VcqI4~|QWY6WMZvkT_#z`45!4@>pE;YrF@tW@+J$9$W2T}-mJ z8%^@fgq%_B%+eAOYnNo^h{fIQ(qEI8N9dgxcg1&Ye&m<*L&k5b$YOyt`!RP(KV;!|(@-Exy2sfpMtwG$iJ^iPQAEM#C#M&+w}{BA z*U8L3*b-He(@xz+*xikYm6wk5@gWv6^8iLo1?^oTVv`f{u!x2Kh<0qP&%8z0(l6p6 zGe1dxelzI1^&omQBopt1cH+?s%4vX+LnKwNt zpJ|fMCS+#qTta4MFC=7o%G+%5kaI^K}qyH>o9N@ecr8# zsQZWrJtd7%Pbi^Y6vWWRJx#Hw2u7+2g4frp@_{ORtaB}@qG5P-+>mS8LR}+D8x9}Ew zOgv}xt2@l`NfEU%@60%M^zC&Kx{ErG9N!S(3r-Ep1Q_Q!iagp8OyW*Sg@Vqc^?3r0) zc;=P!Ht7YR_V+~mUzhmA#TFZEIUD`o>a+Em-SWFAo^Kyp-UMXRT@sH!Ir1iaETV_J zx7bkkCn9j0-7DhpV;T0Tcrf~7^Zc23Y|#-TInQ56rWd?9oWneSDFU~7{z^PCz{#C& z77Tmt`&$thy6aB1UVkT<_}4@h|9kP^*x%5O49~aSC)%W_#Qi}uQ$$Sc&=dET_8&!8 zMZ+R|k+J_*m2VXBwh;q=)-=%u+4077I(~}w>5k`ZnIYmEnWdfg4%4u%#mGxx;Qzmk4`eAzNRTi6i&h%D{{;>q9S z2gMWL=Hemo__GXKAs&o4HY*Q{#}*wiiF4WY@)7amh|Qq7vr_w`B5;UBtdz)Vcuag; z!{n%st0aTr*CtAfT1E86dWenn@Nx0YJzOme+-hATo?6c<8gbT&umQI?J>rRz{GQfH z20!ck){6(j-~2X+H$U=2#?I>7==A@o3V55n+2VO8SaU_p-W=`o68wC}GlvTt&)h5& zF^BhRx8L1f@ivFV+395R;H)P_#Iw8I;xKI!*j9%n@4H_Zw&?mqybZ+U9oQx!FM9{J zi^m?^W^#vkaEL{0`b56yEWfA3gPEKWPcP1>_vF7zgbg_U)CXqvPm2dL`57nM@8YwP zu>rT=#plF>Qy0IBgW6gAE~0y0bWlXE;Vt%%cycp&w|LIx_lI2fh^P|`9d^v!UJ-X^ tzmxmKV+(%D)wy3h@zF6e$ed3ecHRr(IUhYddU9`34V-_->DZaK{{fO`!sh@0 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/RouteDash.frag.spv b/data/vulkan_shaders/RouteDash.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..41974773db04f4362068ee6a91fa6079eccafdf2 GIT binary patch literal 3464 zcmZve+j10D6o#7&lQTI08Za6r#44g_3>pqG0!e^O)JTE^@Z2_;p2?7z>7nPq;R?#4 z%182&NAMAR1n;ygwfw*Cy+}j3b!D&rUx&T++H1PV_005n-U0o0$b0OiYuxJ*_Piml zH`$9DH#g>5?b6)B*?BxhyjvgtKAU4{)}I>u~X}mvJQE9WY5m4>LH!g z3hJ#+qf(5bN-ew|KJ2vaMDbn_N1aA#wp(6Uk`J+i+ION_6eoDVJFGpZHFtxxII3?2 z?RFS9X3J-m(*M(#QDQprMyT78V@$Xdw00rDFhagLb&E^lhUJdxfQmF%_qI; z`m$EqyD}y5=e6(Gl=BvaZ>?_XHF^^rzm8vzN@4AGHGCkpFX4HQj^B)%}Z?gB$obm{InvgA)j#dptW};>7Lcl zoA64*L#Cz|bu$AUzoJ8$VM&u@x%#vGnY1swPp46(OiD@m!c28t9rSrqxJj|j{^cw9 z_DeXQ%wyMIi-Ss97&&+q}^`-tnY_Wq3M;30{>>Z@Dvez8ThQa`7H4Z0OlsU~&a zr<1QtI`6Mb=MDwQgyN|k%>4`cOWknDwD5q_;jtfbn3!orj%Y`RHzDsS$LF*YH>>@C z1b)e3W(e*z;diwcB&^d8pH5*C|DJSwIm_%HNaub>_4h;V#}s!#JGFD4DSh?mJDdr& z{}XEbST^zzLychG3XU2-(O!^H2Q`2%O00L6q~l9|@~vpc7fe3zs^f^~F4rWU_vEtS zHK7yF_7Y4_iV||zd0$8;A3eUVogAFWc{iP&?a{a5cms>SE1kKJ08SCxJJgdFl8tTjrzBuLu8&@-Sx~Nr;30 zLzSP^&iYF^u`Nj8xDWc@>L5BC=P)OiCCnD{!#UKsEP*$CMf$4bsba8Sl`Ko(FX>$R z1823bOQ-gt#A^RkI{dJ1%Y8qS@P70i+pszf|G5O7JFQ8WOMHLQ+1NK6ho7CdC7tuK z{k$OzPkp=>ctshQ&20&HW`?sdx15a_-V|&xccfcP_Fi9!$3_hA4qjB3sP${fVF~Ax z5BoEBk8h-N7ksz}bM>8sUh-S9zJ2d_i~B(sj(CgnrCS_zfbp~U`_b7q)#Fpr0|^|$ zqTl=m$j40VNVw}=iRCCc-g1P(a0qKZN801EILnc}PenYoEp>=mb|r8o%mI8=LQdwJ zdN~hYyYoHic4zC=o;dg$uE#a$F; zaM)t);6o45;oF1Xkc2fLIWNC{?Sm42tHavutfP+qS3J7q zVAhy3)`)~0%+qK_AIs?D(#d^9JKs2bCnVHjc+z3(?J;3;7(OnYJWpM(-;j~O WU50gIdiS=3bLJ)ZVyDOO^!Pu2(;9{V literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/RouteDash.vert.spv b/data/vulkan_shaders/RouteDash.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..f93b5cf6444eb07ef169d5391c619d65985ff364 GIT binary patch literal 5504 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/ScreenQuad.frag.spv b/data/vulkan_shaders/ScreenQuad.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..62c5d12d3d2934d2a72c35319f741539ce8e6820 GIT binary patch literal 1168 zcmYk4-A~j|5XFaGx{IKE3Wz9nSw#~P!h;eMqY0wchfVfDiI2@@TS$}AZn_^)-u<6_ zA@Tg~w%SXExo76g$35LI2?__@#I$;hiQ_oR3~_1)aQEU**(p=O0q$Ek*9fKig3ix zyoko4Dc7`z@|Pd`dVR~?iBH4pBA<@pND9z%hgg1*srLrcn?s)OQT5wW6?GlWBCM>W#rD)hd22$YI$qL>FDmu kev3oRp^O-{Rb5y2s*d?!c=TYuqcTqpUBGv?U~grA0X>#dSO5S3 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/ScreenQuad.vert.spv b/data/vulkan_shaders/ScreenQuad.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..889b7cd0e623d7be5522ad3b38c6bbe9a8bd739f GIT binary patch literal 1084 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 bz^;=!*akL6e&ijT52s&osC-}YzOVlWBt5IP literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/SmaaBlendingWeight.vert.spv b/data/vulkan_shaders/SmaaBlendingWeight.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..92ac3c160efb5d47d445216af6ec56253205509c GIT binary patch literal 2300 zcmZ9M+fGwa5QdkOA_qYc!7~=|2#6;@6p@2q5sQToz1_jGYjy%HX*Wc_xRO*o_)tC610lc%2zuRIBVA?q&&jF|zgZF7JCd3M%z_W4EbtLh`<+ognsL zg5}h|bDx&WI%${p!4HFKV`o47a#*c~jg2sFM3q*Ke%5PIwcgloVVv_Qs8_4aFlIp1 z;@pNkO)=(R*fWoHxK-J&d%cvOqGqhn2o znmIq?#BcYr-U$xsG+ESixD)zBi0yvJwWi(70U1qSNc6@A&xF!i2Jr=dP4J@L0pzxw#+CZQRLpJr%vO zfAG=Cg2kIYK3{`kj#vhMG_dwSHg8hsSTo-rSsg=3{T}wR|uX;oTW`UOv4U z_l;j;J*mU{wD+_ipInGxi}Jzf$*?8)Al5C0=1YkrO-<7ZxM2ZtL0mw^ z^-t)}&~y9){ti7JJ;(Q%%uVNXdfv{x@4R#8es}KowW-BD9nLM%&now`YmIeov3%!N zxFvqh=1$~xO*c!s_U_w_Vzo|kHRl?YiL(kyPSnR@J{mN6G-v9~X1(S$ z1^Kn&`NJWs=TweXZc%>J*<$UH&3QF+%8wK|Z%%%>GFhyKXmH%kY~iU!abkqph)KEc z#hn_?>-Lv~h;q`@UvBZvy+zwbxS4zXXAAwE48JHG3FGRcY$X=xI$p4qPjzw6E*@bG3Zx z##k>Ex^A6K4%nMyEz#WNk@oKz?;G4^-Q}`iQ?q!OzeW3(YXM!C?rlX7!5s{~-D{`( z)#8cG+3443CKfz;eC`tt{T-Uo^Pb{w2tN7ml+W5G;g4U&`pxf@Ki0W_!2CPq-~RLF zp_5on{@}<3pZ6KgV*e!Dxr>MUR10|Sk3qb@#bh+Imzwg; zWj3GhXzcUNG@pCujePEbZ>Fs?XBYT`czMSD-)h z%9I?s1USGTzU9*`oBdsa<+DvTJYXym;(U7Kqp^Ir6FAFg(2ZD#W_=n$a7;ElV4$aV_8ia2 zMq~Yul?`Y4jLMGlIW9lW=Xv>X!0yEIIU$byXe^(Tvf%+^VLqqCp|O1U=D?8;{rQ3r z_vdN(fJw^JUra=&e6rkxhQ|9P6AxKfWsT3f7;m1r9yK z_Ry!+pJ;6V>#|$>Tm4y-4+j|RH|-hOv36WO9I$#@FPFrzcZWbsw47hi%o;K2v9b`~ z=~?*`g7sKMHXL9O)9&;Q+3ZJScY01XJYb+FH|w#gY&3SKiEKE_XHs^YPhEbT&y;*P zV9#v%yeW?TXe^(GYfkd)|`GbD4i$ zHgRpw1=(oet>-SvCKhYfb8pKgUwV#p;?Z;O2)%;!+`EB8&#*ml&!J)eYR&Hn^nt~D zUv?{As|PR1hXYn)>#GmM5ud&y&LzS6inSqq|2i~Z6*%LHV0HK~@TU1FXs$(?k7dJi z9`*l3u=Ci@I_J%WHH-bJd^mfi&t%8XbVEKIU=Z_0_|e@e z-)@0*_HiCH{Yuy`Tn#aA297=C%Nm^NzmW}hTza1KTLF$?+-=!#oH?p`aQEK{XjvN) Q`aM$q|4P>Wllp-0KZ3w8LjV8( literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/SmaaEdges.vert.spv b/data/vulkan_shaders/SmaaEdges.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..33c729765abce6f80c280f6108b302018b521cb5 GIT binary patch literal 1924 zcmZ9MTTc^F6orqptF)shOm7$aG4OCw=gD>Cf`T z#P!W|lL>pW=j^r4KKrcM=d^`^@{n`q^o+Y*m)VpX5O!|N4W?tIx?f%CCe4-gja4!x zTp>*)XVRTd;!%@jDtoJ9tGqL=kmf%qup!f6H3a+?_Y95sfHuJ5w)ZEQ*ityisEKh+q#k- zwAKBj0cjjskNl|B>IMlPS(45R8b80TsS6`%Om5F_#r1>WYp>M`;txR*hmF&^7n$#b zttdV?U&+GnSgrJHrXEQIy!1Mx4EiipB{9YC40anfiqbHw}MqTg} zGv^5pYa|zbyN~G$9P^_Z+1KX5riFUr!qn%^kw2l4weZvf(?_^@z3CxyzyKL_D>~MK5<4&T4Kc=B|Czd2r93$>A{Lo-2l< j{$Bq#wyl_4=D6?tPUr#u1ux{>XYLq#g314<3S093B3FZh literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/SmaaFinal.frag.spv b/data/vulkan_shaders/SmaaFinal.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..611ac6afe22173023e58013054e1a1e85c0ff36d GIT binary patch literal 3584 zcmZ9NX>$}+6o#8j!WI;fT@=Eis30P;DYAuSP=f;k21T7DvxL!P1}Bq95CudOm-3T8 z!yjPz-QVO=WtGp<-3MAOb#mYHp7ox4dnom7U6dpX`1e@yQWHy*zSZ zWYv-N)L25TabzG_ z#Ho^GwmLD@XxCfq$r8dJxSi;9y7igN zHjtiYu6nvVK6yfWnqwcv*$4jSSeU#H7ZodccKP7~pLL>tDH)TmWq1O7X}E&-l0@v9 ztv0*k(~XJQX0y>f+vs&$wFf=bwYOW%PIo%z`jdIM^aSi>@;d`pnMsMaq}oG$GkRZY zFLAfo(${<3hftSsL#$etQPfK71QRn{#woS6s}aZjaH&ez5Bd z)0@a(vNhkWBiDzR%lQ;@shi8C@68OR_->9@5^elu>?L;b8qh-aA!IFieb4Is$Pj-Q zv&$*#xx1z8+U>cxLf=5XK@9pCzbto>JCy5jZ`zl`8*6^;>fVo>{j6ZOp1rO{U(G&* zxOU|F8nEXHeVs;@`PZ|@nZmva&ivY)uh=@)SNDG9^tbj7BuQ=`-AN{M?L_4MFPZNy z_+S6neqa?HzYMmok-w7KvYs}Q zc>>)S<7@2t%2`j{_af&^`8mSx;hEK&h|Bm%c74qk{rw0|k{c)YQ(v3!#pRj)f*D}9 zmhZ>kEn`FXcO-PrHeAs4AA3aiyVw6P`3BkjmVHC&@=qeZnF^Y-SebM3t_8>_9qGFY zFO)BMumv1FczRxcoO z#<-lL_v&5SkG}du{EJ|@U-G%W1eWuA`3=tRVK*Z0ck(AW_OQGDA*;4mkk=63kT}lj zZ=>Icx@SFr6wi7PT_1US^ZSzfn>^MqpLt`pZ-DL9*_zXLa2SyfpCe#>{Cx?ZqhR@S zOvo7>L;O~abs;(Zgx5eE6IJ z>r+O;=S{HuGP?9^Zz0z4K8@EN@o$5TFV12FT|Ruy=03$)yaOj6H7ek!VZ8R=^LsxB zwg-K@_jlP{-n+K*h@AH%j=C4X_EtRqMRfV_xs>}9&;K5reB9G0*f{SHz~(fEG5Xx&?A~1u8AtSSR%7gPG4EOM zHY9%E=D>1_%Q`OinBC{#G2~8O<2qQ**r*{FZ}A4$dtZl`!*A~kL|%Q6{U)+6*X{dD zWDJS7!tkR1IsDaFCo#}w_xM-d9=6h;Iv!MTAt-TVvjM~?{iMy=wB}Ue*o*RZ7;ie O@%McX`oB!;Ao3r=2>)~d literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/SmaaFinal.vert.spv b/data/vulkan_shaders/SmaaFinal.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..647b32485b6319532dd9de357512d5274ffda912 GIT binary patch literal 1372 zcmYk4%Wu;_5XQH09xbIUrL^T4l7=^^;s6yA0>n$^5R{?SSc6pWHQ z3X5bB!CPJ8C22UGkCq7yF_!B#Ov~0@1YtJL^3T!f+bqjRGnF+Bee^U8iV)CY^tcGJ zIG#mCiFxLNj4y8nI{lip!RJAo4=2&Lc^pUi$Ee7Y@PFQm#M30s@=1j?O-I=Gac~^v zU!%N;PUR|JiDMJXW=WA`snC|?Garj5X>pRAX#(`^*%_90-Oh3tOfw4kIz6*)6O`a{ zMtpMNb3W&PP&Uqna3_eb{9rX}*9~Xk&JgzFcdcg(`#Y6Q9mHYO11sx#mgjO(%k{XU zO5k1lBFegZvYWy>(tXv`gS0-pj{H@vyg2aZmCw1si1Pwhq%Mx{dLiG2eDd>F;BRVW zFF5(|nG;xBf9639?zUF?0E3IqOu%;K?`Z8vssFI@FUdyOzpE84`H0iU6{#^lUpfD( z^^JL?6TrJBg#(Uax3#yUm3TR;y1kcj24!zu#SWxk^vWE1Qr8>%?n{k1dv~O}q%UTI zu;-7EhSnECndNyYb9|{N^TvNI24~unG6&8IpT72`-~+MoFIN~iLLUh0Z{>k=T?&sg zySg`IQ`hC;?SP@ka-LsRo}0qS1($xgPcWDBmTYG6NqpvTTMC9a?2c?O@*h`saaT56 ZV(u=O0dMA>lzB4)YU0EHs|?Si{{S&ZWyb&j literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Text.frag.spv b/data/vulkan_shaders/Text.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..ad76ab7f338994041ab5a60fcfc76b12bf2551c8 GIT binary patch literal 2072 zcmZ9M+foxj5QYbG068Oa62%R8MiCVdMNmWy7pbBwQ7^YrNrcsqP35F`rDgeEK7x`vHXsAjtV{=0jodp4=w#Xe(t^fzptnP`ohUfISBnylUPg|~&}W~;osy0!vi z#H1_{&Zy}(Y3;~yF{t4fluSvUO2)*+ry|l)Hs87e(`LZr3x0loKVNv|m+E!D**d9K z{Ay6E_~oEcDYb%51zvxG7t~7Cb~#DNh>@(FF&T4CwGOK%^`qUe8a9lOv^`VDFIfP4 zM4WQaY-y7}W6o=D`^UxR=Yz^ui)HN{Iu6?n!$vvEbxHnWwSH8zyp);O{_e%Tx|OxM zOmc;`FQS*Bjv{ZWr2KWpzK|dm~@a30nt^Vy*cxY#a;f=A`3o|F99Z z>y@&m;A(OAE`C3{iw9Nz$Vm_I&BeYw<#Dw#!uE7pXD@a+rx@>O%<`f*@+IT2iF+<_ zxxmiGamHjEHgVr2E)MK8E;<8qfcIPCc+3FokA%B%eq!m7r+q=fa&|5)4E!5+}w6Wg1y&CJ2@563=o%<5%~ zYDdSPT+W_TedYj<`0o_N;bK!di;$i;-z& zWM7uf-MH_(H2MbSBzgBM!l?^~TG*Zhj9R(arZ%;(7bLEi%oZ-^cW1dSJ;~RnXJ_O5 z>#@yUH)EYMQ6HP{ky*kg@3zF4Z!g#NDycTmv-0hNv&cz(upN2n)m4cnp@+GXTVqKWKF7Nw-IJWHaaS0=A90Ok z>BNG&bKH~8-Gw$DnfD@2V{z=xrt1_j9;>~@>EgI8zf&YA~IU)hV+ z>ScYSK7t>oH?{iz&OMt34r_Dv{-6KeXYYOXFcgMnN1Z#QpGlXwd>wZ~vYk8PiheJz zZ?4aGd$sw6OBY}qbp=m^^NO4B`mlaC$jt7yB&3V&l*Y8NLxu%OFK!mm+mI;#s+w4tJ>(-1_>i#4BkJY%#Z1gxZQ3% z+emk_-c~1Wb?aHDd49LPu+*$CEG*S8E{Wpsoz&ij=Ix^D3-+EHyb;wJ@Ow$z_zrB; zy(+9{(UY3LO_0tC?ltXCgZ_#3cGmTA=uaHUN_%Ohj={Yq?EY#+9WQ!art3$|td=yk z)8whpQIFHRe$?({kLeEHPG@8OY$!k5S8#rw$K=)e(M~7px09M)((a;nd-%n?)*E20 zl%92oLH&2McORwop6XO79^;+ks3ls=^9n1v4edLPXd~%tC!JpM3pjUyvpBQjsSBLC zJf60Co9T1CI<8viwKexBYid>n^ zcn`aoWu2PGnb+N@8F!zEn!_Ha$oK$W)(r8c(-PL2Y~GVKB3aXKvu8cJAJYfW&#U>- zi$OnZ{FWsa3+$jD??32=jo%B2`GNiKm*>S?!23&LJZ1vyrKB9@6JKg&HqJ>{X3ylN zx0wlgL5{?;cRvz1hH(zY&K>abI|}~qhD;wX)^5Fp$2+pP8+|Yr>=}v0tV?IX<*kWh zb@0ZPC+EB^HvKpu7Q7i**yvNzirPz(Q{vM{YJ!3Kv?!HwMINtfCl7MO=H0M4H~yS-&bfC%`ymN;F9nD-0? z;4=HHysJ8ZN4#1ffe{be=GW@m5r#kf$J)8y>c?hI!HmzG!ne2bUjpv=twnv-sDpW9 z;q$kU5$*UgS9}jyZP<4X*!+#Pb7qjgv1T)m4}*P8@xT`)%uYqoXSH7r7&wbO$?2}L zpl??ta9Dxvv zzbPHe>bftTx|mt3Yg;K>AvqjJG#fHxvRqb^NvyM%FA4zs34?^rzIvjA`nR|&7Yv;`T_`YZ6 zIpec{{g0;QiiDZxZOM@}A-OCbvppH~aqUNg&J6Q^9G{Eh+U;|}|8c~@hQt4E*yO-| zLP9)pfQwBZ;GU9zO-bMvwV#%N!zUItXUydp3Hey;v(oXe=qCE~h6D^@F>4n0P3h!s z_Ox{3+swWt9e8|xt)>*0IS5BBi9FmS8&ed*NtyP^^20|^{(i}Rs$;>=0R?<48p fzXiW}>0tPq-^bF;kNmLVS$!A6`M;_Ho!R>j`6Us| literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TextBillboard.frag.spv b/data/vulkan_shaders/TextBillboard.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..ad76ab7f338994041ab5a60fcfc76b12bf2551c8 GIT binary patch literal 2072 zcmZ9M+foxj5QYbG068Oa62%R8MiCVdMNmWy7pbBwQ7^YrNrcsqP35F`rDgeEK7x`vHXsAjtV{=0jodp4=w#Xe(t^fzptnP`ohUfISBnylUPg|~&}W~;osy0!vi z#H1_{&Zy}(Y3;~yF{t4fluSvUO2)*+ry|l)Hs87e(`LZr3x0loKVNv|m+E!D**d9K z{Ay6E_~oEcDYb%51zvxG7t~7Cb~#DNh>@(FF&T4CwGOK%^`qUe8a9lOv^`VDFIfP4 zM4WQaY-y7}W6o=D`^UxR=Yz^ui)HN{Iu6?n!$vvEbxHnWwSH8zyp);O{_e%Tx|OxM zOmc;`FQS*Bjv{ZWr2KWpzK|dm~@a30nt^Vy*cxY#a;f=A`3o|F99Z z>y@&m;A(OAE`C3{iw9Nz$Vm_I&BeYw<#Dw#!uE7pXD@a+rx@>O%<`f*@+IT2iF+<_ zxxmiGamHjEHgVr2E)MK8E;<8qfcIPCc+3FokA%B%eq!m7r+q=fa&|5)4E!5+}w6Wg1y&CJ2@563=o%<5%~ zYDdSPT+W_TedYj<`0o_N;bK!di;$i;-z& zWM7uf-MH_(H2MbSBzgBM!l?^~TG*Zhj9R(arZ%;(7bLEi%oZ-^cW1dSJ;~RnXJ_O5 z>#@yUH)EYMQ6HP{ky*kg@3zF4Z!g#NDycTmv-0hNv&cz(upN2n)m4cnp@+GXTVqKWKF7Nw-IJWHaaS0=A90Ok z>BNG&bKH~8-Gw$Dnf&V=LTF~)=y4doEmL3 zOQU1^_u#S8^=6Lvta2}9_ELRT!ng`KCtMR^VP1G7JQkh^z4{|=Tpvr_3O6|wOioWv zPMr>lwOY_<-btb$iK|giitACa8Mh<+mUZ~W)nd{rbvhK}(K&xX6|U19VXc;E4VeL zUx>ow^E`H~w6t7qL<%O?dhsNkjf>fMzZ(*7S^-gBkfh9ahx$e_OtjpLpH=_7jzYGl zVNgpOaWhV}%LVP@MfqGlF|AYT%WP5C3My$SO0LAwZK?g4&VILoT0OnVjuP!Owk#X# z$;V#Un|wUa$w{|@*?QWlMJ1iS&BcB%>U*iD;4Y(8W45870>T< z@$b9%4_%zQ+YX9plGc^4;1`l8k^jeBZw>`iAJoVa6xi$Um5`mZr&(C>{bxz4?MEs-F4s{m$#F zi`zMHZVm5)KfhbV+I;tA<4X<92cP%aX07UH+4wR?XEVM<(GN6$ANharPH5zVFL=%N zS=`2Vh+`E9@8kG*F8yc_&kKeap+oV$B!TyLMXaQ|uK`9})hQN(hO&kD9SIKMZY zoZkTB+H^4Y=f!_f5Vdba)Sm5qWYqlx%pLh+OM%~nSUR6>1w15xIv>DlG z_?mX!YsAiICg!>z5RX6OypQ9`%N_ho;NEgKsg3)ne=9QmseFk4LLdkF5$zUxgN8r* z9|+u4tKquW)GcbE*QnL%x*_|zz}RjNtE(hVT}8p_ie#f(U1iziK&LLw2+j8Rrfh1p zoVR3m=S-xbTh5AX;?RlXozw)*itj0Ma~|Ia=*Pu)8!ds{ydmC=`L$&;_Q0RxZP~=4 zQ#1F7IjzRKvdL2wY~A0U3;D^54>jFa|C104+!5m8a{}}7ULOhzo-^;S!Xx3TvXlQe0Uz`pfwLyhyn4pS zL);(26M?bEp8u<=4+^|la#1I3rEoxgyvZ9!Be%WRw`JqY81s>rUD;@(0{-kZnyq<{Y;xF|_sT{CH0rW7?vssg=bpbO zjy|LMxLaca8sHqz_6y`?%=T|wHs@jca6mSGG}8{sM(f<0L*n={Mvk2VIhp5uf%|9m zPRM4xo%Mboj&AiHmW>9i-XpTf#hB$fCYxMG1zW>$*~f$@ew`;|6N_$ZI4K*QX4)y) eXr1diEsif^yjyVJpZSNfSvNla>21MztN#O^7g_iK literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TextFixed.frag.spv b/data/vulkan_shaders/TextFixed.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..eb52418e0565eb5242be910a1501fc930a67a19b GIT binary patch literal 1748 zcmZ9MTTc@~7>0+QK#-HjNfg_nqN1pY5)-2lQOiY>#)x{kY1*}{F5PB(P`vWS|K(5c z=Xhh{`^@f?)gfQ!d*AOk-|UdjZA}_8p}$#k-z00%Tm12{Xu*8;UnuZ zXY$q&pLsK73fhsAX3)hjBUzE$l`O~?n~F%w+kATpESPCit9!LZqgH?AwR%0TKR6A2 zFATcA*A8O8H3&vNep4C0pxX+E?W{vl9@*MOQ#9vPs}r8~jt`Vm{ZZ9jY;_+P|M zTAuj~y1;L=Xl>^+I&)#+hhDYl3|E9X3ptlE zHtwIC%mCX)YCBXO&d(}J4)yEsmSz9t_-+=gUlK>YY#f-l=Mt9-?*BM?%*KI<`z~>D zaA$EzU)%$JKPAqOJAnHo;cV_cnGttUm9QMHB+&Za8tVo7KC*M)O>Ik>D7{paoBHT0 z(n{LPl2z5APcXfd^*f~<4gpVVpGfhO6m#cr*k@B4Io9=M%xg!-o?Q-as6O|AAMuN+ z6CC-$?pvY1i^Alicl?*NlM5byFy9E=vhce0vV^sh;!6oMYr>bMb2iSqDUF%KImw=# znNk-YYJs^IIBJ!(Bh;oAdPTyl>9wjIU;1~wY)g0cJE=}h@`HJA*zqUsp2V1MFZcA- zk&C`r`1}^bw@57a#=CU6xEKC6fuG9G&U@tUo+%n%Fg9k-n`7=^X1gk3t{+r^*fj}0 z@NdM?8*dSwMNaC$?aRv9wChnR9o5RD@2V{z=xrt1_j9;>~@>EgI8zf&YA~IU)hV+ z>ScYSK7t>oH?{iz&OMt34r_Dv{-6KeXYYOXFcgMnN1Z#QpGlXwd>wZ~vYk8PiheJz zZ?4aGd$sw6OBY}qbp=m^^NO4B`mlaC$jt7yB&3V&l*Y8NLxu%OFK!mm+mI;#s+w4tJ>(-1_>i#4BkJY%#Z1gxZQ3% z+emk_-c~1Wb?aHDd49LPu+*$CEG*S8E{Wpsoz&ij=Ix^D3-+EHyb;wJ@Ow$z_zrB; zy(+9{(UY3LO_0tC?ltXCgZ_#3cGmTA=uaHUN_%Ohj={Yq?EY#+9WQ!art3$|td=yk z)8whpQIFHRe$?({kLeEHPG@8OY$!k5S8#rw$K=)e(M~7px09M)((a;nd-%n?)*E20 zl%92oLH&2McORwop6XO79^;+ks3ls=^9n1v4edLPXd~%tC!JpM3pjUyvpBQjsSBLC zJf60Co9T1CI<8viwKexBYid>n^ zcn`aoWu2PGnb+N@8F!zEn!_Ha$oK$W)(r8c(-PL2Y~GVKB3aXKvu8cJAJYfW&#U>- zi$OnZ{FWsa3+$jD??32=jo%B2`GNiKm*>S?!23&LJZ1vyrKB9@6JKg&HqJ>{X3ylN zx0wlgL5{?;cRvz1hH(zY&K>abI|}~qhD;wX)^5Fp$2+pP8+|Yr>=}v0tV?IX<*kWh zb@0ZPC+EB^HvKpu7Q7i**yvNzirPz(Q{vM{YJ!3Kv?!HwMINtfCl7MO=H0M4H~yS-&bfC%`ymN;F9nD-0? z;4=HHysJ8ZN4#1ffe{be=GW@m5r#kf$J)8y>c?hI!HmzG!ne2bUjpv=twnv-sDpW9 z;q$kU5$*UgS9}jyZP<4X*!+#Pb7qjgv1T)m4}*P8@xT`)%uYqoXSH7r7&wbO$?2}L zpl??ta9Dxvv zzbPHe>bftTx|mt3Yg;K>AvqjJG#fHxvRqb^NvyM%FA4zs34?^rzIvjA`nR|&7Yv;`T_`YZ6 zIpec{{g0;QiiDZxZOM@}A-OCbvppH~aqUNg&J6Q^9G{Eh+U;|}|8c~@hQt4E*yO-| zLP9)pfQwBZ;GU9zO-bMvwV#%N!zUItXUydp3Hey;v(oXe=qCE~h6D^@F>4n0P3h!s z_Ox{3+swWt9e8|xt)>*0IS5BBi9FmS8&ed*NtyP^^20|^{(i}Rs$;>=0R?<48p fzXiW}>0tPq-^bF;kNmLVS$!A6`M;_Ho!R>j`6Us| literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TextFixedBillboard.frag.spv b/data/vulkan_shaders/TextFixedBillboard.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..eb52418e0565eb5242be910a1501fc930a67a19b GIT binary patch literal 1748 zcmZ9MTTc@~7>0+QK#-HjNfg_nqN1pY5)-2lQOiY>#)x{kY1*}{F5PB(P`vWS|K(5c z=Xhh{`^@f?)gfQ!d*AOk-|UdjZA}_8p}$#k-z00%Tm12{Xu*8;UnuZ zXY$q&pLsK73fhsAX3)hjBUzE$l`O~?n~F%w+kATpESPCit9!LZqgH?AwR%0TKR6A2 zFATcA*A8O8H3&vNep4C0pxX+E?W{vl9@*MOQ#9vPs}r8~jt`Vm{ZZ9jY;_+P|M zTAuj~y1;L=Xl>^+I&)#+hhDYl3|E9X3ptlE zHtwIC%mCX)YCBXO&d(}J4)yEsmSz9t_-+=gUlK>YY#f-l=Mt9-?*BM?%*KI<`z~>D zaA$EzU)%$JKPAqOJAnHo;cV_cnGttUm9QMHB+&Za8tVo7KC*M)O>Ik>D7{paoBHT0 z(n{LPl2z5APcXfd^*f~<4gpVVpGfhO6m#cr*k@B4Io9=M%xg!-o?Q-as6O|AAMuN+ z6CC-$?pvY1i^Alicl?*NlM5byFy9E=vhce0vV^sh;!6oMYr>bMb2iSqDUF%KImw=# znNk-YYJs^IIBJ!(Bh;oAdPTyl>9wjIU;1~wY)g0cJE=}h@`HJA*zqUsp2V1MFZcA- zk&C`r`1}^bw@57a#=CU6xEKC6fuG9G&U@tUo+%n%Fg9k-n`7=^X1gk3t{+r^*fj}0 z@NdM?8*dSwMNaC$?aRv9wChnR9o5R&V=LTF~)=y4doEmL3 zOQU1^_u#S8^=6Lvta2}9_ELRT!ng`KCtMR^VP1G7JQkh^z4{|=Tpvr_3O6|wOioWv zPMr>lwOY_<-btb$iK|giitACa8Mh<+mUZ~W)nd{rbvhK}(K&xX6|U19VXc;E4VeL zUx>ow^E`H~w6t7qL<%O?dhsNkjf>fMzZ(*7S^-gBkfh9ahx$e_OtjpLpH=_7jzYGl zVNgpOaWhV}%LVP@MfqGlF|AYT%WP5C3My$SO0LAwZK?g4&VILoT0OnVjuP!Owk#X# z$;V#Un|wUa$w{|@*?QWlMJ1iS&BcB%>U*iD;4Y(8W45870>T< z@$b9%4_%zQ+YX9plGc^4;1`l8k^jeBZw>`iAJoVa6xi$Um5`mZr&(C>{bxz4?MEs-F4s{m$#F zi`zMHZVm5)KfhbV+I;tA<4X<92cP%aX07UH+4wR?XEVM<(GN6$ANharPH5zVFL=%N zS=`2Vh+`E9@8kG*F8yc_&kKeap+oV$B!TyLMXaQ|uK`9})hQN(hO&kD9SIKMZY zoZkTB+H^4Y=f!_f5Vdba)Sm5qWYqlx%pLh+OM%~nSUR6>1w15xIv>DlG z_?mX!YsAiICg!>z5RX6OypQ9`%N_ho;NEgKsg3)ne=9QmseFk4LLdkF5$zUxgN8r* z9|+u4tKquW)GcbE*QnL%x*_|zz}RjNtE(hVT}8p_ie#f(U1iziK&LLw2+j8Rrfh1p zoVR3m=S-xbTh5AX;?RlXozw)*itj0Ma~|Ia=*Pu)8!ds{ydmC=`L$&;_Q0RxZP~=4 zQ#1F7IjzRKvdL2wY~A0U3;D^54>jFa|C104+!5m8a{}}7ULOhzo-^;S!Xx3TvXlQe0Uz`pfwLyhyn4pS zL);(26M?bEp8u<=4+^|la#1I3rEoxgyvZ9!Be%WRw`JqY81s>rUD;@(0{-kZnyq<{Y;xF|_sT{CH0rW7?vssg=bpbO zjy|LMxLaca8sHqz_6y`?%=T|wHs@jca6mSGG}8{sM(f<0L*n={Mvk2VIhp5uf%|9m zPRM4xo%Mboj&AiHmW>9i-XpTf#hB$fCYxMG1zW>$*~f$@ew`;|6N_$ZI4K*QX4)y) eXr1diEsif^yjyVJpZSNfSvNla>21MztN#O^7g_iK literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TextOutlined.frag.spv b/data/vulkan_shaders/TextOutlined.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..ad76ab7f338994041ab5a60fcfc76b12bf2551c8 GIT binary patch literal 2072 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

FIG7?;Xk5FpTph!(nUOS;yhqubtQ{ z5b($Ttk5o4-sdEfo7oOZ-sHd<@^$4voV-9RZ1#yOXdV*iBX5tGvo)U=;O{%XNHV_g z^n$a7!=C##EbtbshLYnnO>nW}sMT^UOU9Np%h~d(h$AoFwB^Nr&fqOC{kO~`20VFj z=isoX-pc~HTFfhwr^mc14&GwECmBC@{P+%hC~(%R1!8kQt_kpVAFoR$HurHw`CNbl40?~> zZOyFh(%q#`UkFPDav?r(u_32Bn(qpHE4d^1qvONA?DIglpV7aR{Ltz2>MP-h(64yd zf9*K=gJW5{tet76>~OW0vNHPM)KAk(2p`Eq3yJ%}WHnp^s^{Z|E|~ z#6%}f%QSt1)9E|$RtoI3LLg^)xk`XHn>CWL$==P!rNiG+9DJS-@PnrhP)7v5?(AQ_%v+(F53 d*}4u%$CfqTEx7K^{AJ11jm>|0Tj;#i{{i2SnAQLQ literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TextOutlinedGui.frag.spv b/data/vulkan_shaders/TextOutlinedGui.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..eac257a5ccacdeefb1c4b197f3fea8dd501ea3f0 GIT binary patch literal 1980 zcmZ9M*-sNu6vi)f0of7RL~#o4D53(Q2#BcVp$Rc=kCUbyVYGCbZi-JDKrPySlu(wt~lq$yi5x zMoquT>O_vqVI9MuWJ>Z>GA3VaDk3do^Q|i|YX(fQ zSHosdX@}hazy6e8Sg+JN)wDxS9_iXSlQZX3>#%mxINFP9QPYUY+Mc?8#S-8V`BcMJ zTZim9b6#i1KQ6aEzYV@xE^qJ9b=+PQHLG#1OR|@1jia*l%b0nc@17rMT6wDrk}IkP zwfAB0MQoqtnODbeG^0=4F0!+7F}>Dy*o-=jpsFc5o=JE7gufs6>cQ2+k5TiuCDr!N zth@fJX8AC_bWyWr4m{}Wgr}Iyf}VM>4aKU}nF9}g=nEE|;({=}5;u{uv2Sv6M{IM6 zZC`m@t(>@hb?flrf1gv1_hiia#c||I$AO7^CULpoPUGTS^oZYgiSuKYaK9z=NFVWC zvc{9XAmQQep3VY55560*YHiHg-2vNHVw+Gl@)g8U3w=sjUZ*FSR$lr9^Uiwu->(x6 z0T1ZxN$_TZ*&Q7A;lxIcS#5Y!Cpz}@qhMN?g)#*uimJ)n1hGs_ivUKjoedm>#xxqQ!-TR6-YGS7j*pt9fr;uRkQU|;s zaecB^bb5DvT$i5q*XLvR;_T}Q=AN60PCwKKvuE~*KY6z$#(aCRt~Zie+=&ODKVo=K ziDjpJdoC9{2F;7Dumq zfABoyq(0oPtjy}F#FH>X_C;>uu1T;tzZ=p$34YAe`Q4O`?PpT&mULp_UF>b?p5$ze zC2`oC-yP|m7E38`aTbZ zvHePFtx6{sJo95;aIWr}bhuslv)@M&_QpHqeE7|PcR3$Rha=X-J(2F>r~}529PF0g P7VOw~AHjch!wtzlOcQ~~ literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TextOutlinedGui.vert.spv b/data/vulkan_shaders/TextOutlinedGui.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..0c427d0e3b1d405e17fc4e761b48ee5dd2343360 GIT binary patch literal 2780 zcmZ9NTUQfT6vvN*#2Z$;Yi(%|?-#VKqSh)PU{Iq8BB)QZvdE~TA(NF0TA%EL?|vn} zl`pQ<|L@G%FmzZuXYc>M@3Utp3{C8GZioK%xmPZG4!9x7&h2$2e^#o?)yZDJIeGoY zH7tH|1#gJWe);hXi`E-S8~!)ZAEG;=1yMy*6|IO?MFsugJEfmtx5rhgQKeR^R2QPP zPABU1|7pchD{043GwH@_{bVD?ZdcAOX|J^g&AdTT7Wo>At|$-Zl3s1lCz$x6@{Z_S zxnEOfCC^KAgJ?Z%#;w&P{vdRx$Ej}+b-L+0DoA}_<}>7VZ@THA6E`&x!>aC-H4((W%OpBR;575x2We96s= zSxZ}K_j&wrE={{lZ&UL3+laPnm^^phh|+BKbK4!cEB0X{^YgvbB@Z^^WWBI28_{~B z_kJrWJ+ecM|KW>@$=&i4MT`11dBUUHF)h6t^>&#bGsycP<2NI+SYTUzS$uW@yU!xC zV-LW-iYj5}u&by>_TiL>$K>%$^fGrpmXo<-WO5VV?s0FhF$_HzCpodRoD1TKVKR4v zOr6+r7d+Ghzm>n>xECID@cG)2soioeiRZzVyR*8Hxie(m(L<_)TE>-|8sLwLE9oqI z8uoK$)?k<9#kpIgXZo1rJz~I!cU-^p4u(7?4R;S_IJ&a5e67fb{!Wm&6R;za_vVUZ zwSr@h%y%Bl=5<#*{@Bk3oy~tvGX3ZCv7gvme)iL3{Mkw3pU?(8(Mc`n^N-0VW%*PJ z?8sjWMqtE8t_KYLbMeHsdXU*&Fsp~%CBDu3rFiE)%}?olWRC0{4?f?8@EyUIKKUQS zX)@n_li3Bn`+50lPM#A#ALLne&2AkQv9F^d_U^9oFpnc5bR&v}d{jiu^u>FF{+=qN z9(3k+LOj?PRgK@zBK8#=d+G(lo}Da<*vF+{e=1-)HnE9-k>Bi22aI{uRU`XwMub21 z=*LA?*E#XzHrw;!&jvyV|F3Ew&IJ*%u$dLc&R-TWr;8$Dvj0~^;9rB^q6N5F&F`kEFGZhg&&#}6F8S)KPqyr;~AJjgR5>-B+n-b0fY#aDt{()m!tp41hO**ppu z_=q%Mk44OZ84`~e*pZJtMo;{wI+sNCAmjT?gw4ya8_VLc0Ur`EN8<1;KxcKn5WgC9 ND>{*XsES*n{{Su0)~f&j literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TextStaticOutlinedGui.frag.spv b/data/vulkan_shaders/TextStaticOutlinedGui.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..eac257a5ccacdeefb1c4b197f3fea8dd501ea3f0 GIT binary patch literal 1980 zcmZ9M*-sNu6vi)f0of7RL~#o4D53(Q2#BcVp$Rc=kCUbyVYGCbZi-JDKrPySlu(wt~lq$yi5x zMoquT>O_vqVI9MuWJ>Z>GA3VaDk3do^Q|i|YX(fQ zSHosdX@}hazy6e8Sg+JN)wDxS9_iXSlQZX3>#%mxINFP9QPYUY+Mc?8#S-8V`BcMJ zTZim9b6#i1KQ6aEzYV@xE^qJ9b=+PQHLG#1OR|@1jia*l%b0nc@17rMT6wDrk}IkP zwfAB0MQoqtnODbeG^0=4F0!+7F}>Dy*o-=jpsFc5o=JE7gufs6>cQ2+k5TiuCDr!N zth@fJX8AC_bWyWr4m{}Wgr}Iyf}VM>4aKU}nF9}g=nEE|;({=}5;u{uv2Sv6M{IM6 zZC`m@t(>@hb?flrf1gv1_hiia#c||I$AO7^CULpoPUGTS^oZYgiSuKYaK9z=NFVWC zvc{9XAmQQep3VY55560*YHiHg-2vNHVw+Gl@)g8U3w=sjUZ*FSR$lr9^Uiwu->(x6 z0T1ZxN$_TZ*&Q7A;lxIcS#5Y!Cpz}@qhMN?g)#*uimJ)n1hGs_ivUKjoedm>#xxqQ!-TR6-YGS7j*pt9fr;uRkQU|;s zaecB^bb5DvT$i5q*XLvR;_T}Q=AN60PCwKKvuE~*KY6z$#(aCRt~Zie+=&ODKVo=K ziDjpJdoC9{2F;7Dumq zfABoyq(0oPtjy}F#FH>X_C;>uu1T;tzZ=p$34YAe`Q4O`?PpT&mULp_UF>b?p5$ze zC2`oC-yP|m7E38`aTbZ zvHePFtx6{sJo95;aIWr}bhuslv)@M&_QpHqeE7|PcR3$Rha=X-J(2F>r~}529PF0g P7VOw~AHjch!wtzlOcQ~~ literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TextStaticOutlinedGui.vert.spv b/data/vulkan_shaders/TextStaticOutlinedGui.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..0c427d0e3b1d405e17fc4e761b48ee5dd2343360 GIT binary patch literal 2780 zcmZ9NTUQfT6vvN*#2Z$;Yi(%|?-#VKqSh)PU{Iq8BB)QZvdE~TA(NF0TA%EL?|vn} zl`pQ<|L@G%FmzZuXYc>M@3Utp3{C8GZioK%xmPZG4!9x7&h2$2e^#o?)yZDJIeGoY zH7tH|1#gJWe);hXi`E-S8~!)ZAEG;=1yMy*6|IO?MFsugJEfmtx5rhgQKeR^R2QPP zPABU1|7pchD{043GwH@_{bVD?ZdcAOX|J^g&AdTT7Wo>At|$-Zl3s1lCz$x6@{Z_S zxnEOfCC^KAgJ?Z%#;w&P{vdRx$Ej}+b-L+0DoA}_<}>7VZ@THA6E`&x!>aC-H4((W%OpBR;575x2We96s= zSxZ}K_j&wrE={{lZ&UL3+laPnm^^phh|+BKbK4!cEB0X{^YgvbB@Z^^WWBI28_{~B z_kJrWJ+ecM|KW>@$=&i4MT`11dBUUHF)h6t^>&#bGsycP<2NI+SYTUzS$uW@yU!xC zV-LW-iYj5}u&by>_TiL>$K>%$^fGrpmXo<-WO5VV?s0FhF$_HzCpodRoD1TKVKR4v zOr6+r7d+Ghzm>n>xECID@cG)2soioeiRZzVyR*8Hxie(m(L<_)TE>-|8sLwLE9oqI z8uoK$)?k<9#kpIgXZo1rJz~I!cU-^p4u(7?4R;S_IJ&a5e67fb{!Wm&6R;za_vVUZ zwSr@h%y%Bl=5<#*{@Bk3oy~tvGX3ZCv7gvme)iL3{Mkw3pU?(8(Mc`n^N-0VW%*PJ z?8sjWMqtE8t_KYLbMeHsdXU*&Fsp~%CBDu3rFiE)%}?olWRC0{4?f?8@EyUIKKUQS zX)@n_li3Bn`+50lPM#A#ALLne&2AkQv9F^d_U^9oFpnc5bR&v}d{jiu^u>FF{+=qN z9(3k+LOj?PRgK@zBK8#=d+G(lo}Da<*vF+{e=1-)HnE9-k>Bi22aI{uRU`XwMub21 z=*LA?*E#XzHrw;!&jvyV|F3Ew&IJ*%u$dLc&R-TWr;8$Dvj0~^;9rB^q6N5F&F`kEFGZhg&&#}6F8S)KPqyr;~AJjgR5>-B+n-b0fY#aDt{()m!tp41hO**ppu z_=q%Mk44OZ84`~e*pZJtMo;{wI+sNCAmjT?gw4ya8_VLc0Ur`EN8<1;KxcKn5WgC9 ND>{*XsES*n{{Su0)~f&j literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Texturing.frag.spv b/data/vulkan_shaders/Texturing.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..8415d1742c075c8fdff7cdcc58ddad8ac343833a GIT binary patch literal 1496 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 BH>>~v literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TexturingGui.frag.spv b/data/vulkan_shaders/TexturingGui.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..c435286b497aa92dc57ca0cbc94d5360ee8ae284 GIT binary patch literal 1404 zcmY+D&2Q5{5XF}yPD%^?ptPkFO42|9Ayptjg@izq0`4JF4tyQ0D0V9&Cytyre4My& z=g;MW#QUwi)ND1`eQ(~(&WyM9TDN7)1^rz%_f4_ZOikFBCDXLK-+R|Pn9jn3$4?%j zST=PlM6+UArlB1h4dOA5HQBywRXTWGpi|xEI#f`@EE>NT`2D`$dlL*NlVCdgmPA1k zkE0-rvuHSr=MlPviY^`xlRT^nJSnR8dd4#sb=PS;9wf(Ul4eGXr_PMYgCWHG=qp^y z);Ryi9j9p)P9>ACZZ@=kc-2?;O?!sVgHakr$;UYQBDQ6D`p<(&mVTz<)b{RTYSwp_ zrTHWZH8saGxjZQOM@4;GaO3zi%|>Mno}J%3c$*E*ibj0ZMIS6*U31>E=p1*1sR`|J z#mD#9E%AwB>5t{fPW0<=*Rua}e7jYvE8@ssjRO<+Qs#2OoyQgVnFqQbGN)q}aKB{K zOdaUxkC{~a19xOB{JbyM)4HOF>nH~~IdAIJ)ZUhDNl!gs-b-7*3)n;5182$Ttm6g6?q@X58jqBmkr_T+S@V~e(;WrI>>)RJGrRc`ETh=JpQ(JYQYb_ zqa7a{^?>(Fj(BwUWX61deW;g1ZhB-9_gf6_iCDe~|G(sVF3fCs$IKPX?5@a|+b2b# zTbH4Mf1!-T!yV~ndbufMKFokV$wN)N9ehX1)7IXR5lgR5vsdyzr6Hy(gCo|(-PYN~ WaX%OxIjHY$>Bq-hz<)IDr?S6jX-a`A>O71WpzO_Z1z@0#JENiis|lcqD0G1Hl5Iz{A(pTN)c z#l-cUnN#M$)9jwT*1qqa)@z-nF<10iFi%WzmQ79An0Yg6Z?AjU-5uw_?u(bt@K`i; z>xj>ixoY(peGmIl0=Onwl59(MBz1l8-P6~MtX|jmdOffE#UG4D{y6^~hkhI-p&vw9 zILM=u5Wl&KUz7~uNlrOUF?jrHR<4^`|e( zM@fDdovE@h4fV?moQ6Kk()UL$)Y{j@egD|A`O!HOf0zbgd=!PhY<_t1PyA7q{$w&0 z)}beCHETQ0(#a?cv{}cq-HBiF&x;;z!zIy=G#ieks)wfC?}stoPA+8bHn1s6nCr#K9`&xn7L7jBY!mx zOx$~ki-Wt2D{|2be&-VB$FATmB=qd|O3&OC#-b?F@PFX$#ewaK@r z8((n`1|Mb&kiv#+-fL(@UW)J#&cpBZl|$Ml3mbTkPShSY}=+ zIbBokR>@K0K%LRsssvwb?2TQ0P!8t1D`94S59%=MJqi4Ue2BjHq)$ literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Traffic.frag.spv b/data/vulkan_shaders/Traffic.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..57b99a13d0324474129a1f4955ff38756bc59942 GIT binary patch literal 3472 zcmZ{l>vB{@5XUFkBoGKUxkeN=MDc<~Fc49MBm~%~D;pqy_rq~_lPuZnSFeXsDGyWKRw+&-Mxpx@bnJnhV*Zb>$+?maKqA_ z+wI2uUMk-y&vd%Ane!LUVzJj1ydgIG+_)Rj4z}V(i-QBgi^3biBVoVnIaeS_1@CiC zmq*+#S1L!PN~Ki39#z}zsMGzfS&y2HRz0dU(t5Sq=-08^8Q3*i)n>028jQ*!jE_F9 zSkfean;d$!Wi`r@Oke4UEmScK5 z_lL8yMnCDUrg5vYmZV#v26yR5FY2c8+FGN!5~uN2XAqCt^rH1N>9y-Mb@JXGJe$eydT|2AaH_a?I_1 z&t>=U5#B@R-hyEF;GVum55s%t+c*S_ea3dOSnG; zYQj5-K~3OK2`tk&XQ9(yYG(HQmaP{D#lla?XCb#aB8hlK;i&HO4s>!Y>hDhNa9~ou z&|TU&9}>c4`f>T&tpn`1Kam^3UCMQvE8^`Fk3aIlo}S?g9(#1=36Aqa+AYV!(vNsv zf3(iz`ccWe&*ItqnLp+Vf5&8B)Q&&idqVG<(q0T;Z?~NssDD<+ECxD#fg`7vv=@aT zft=7^7U(tiPix1PcXQ7En&8~ydDCB)cJj&QJoaZK;|n|9fKH#`sNt-3&UiES7q#P` zoGt$QlEZk5(trAKau9D>`t0ni*U9&$Kus*4TasCaC z8angzoWLyImsji#3fRD3QAGU1E$STq#{@X$2_MvNQh>*v_~;goZx^#>@%Y^_YZmXM zWNhHMPrh)A@_btRE5fwEtb{RN&Ce`{H>K163Ed;78G%`#cAQP9TJUcP@aF{Pi5bK8 z2fdH;vpI*|lbpkrc$`@s^xw&;rF9r;kl^Z9v2ahb&nIS0=o2YPGvbCP+x*}o$h z4zSFg_{{RVg4M-*yqELld*OgfqGzP^}ivRdWADlk`8Zu`#>_> zvS2xUC>h>hIea9}a-dhl#MbIkmOL(0^q2mAEWmM(8RIv}`wN2oZm_XAu1KcVH-#|g z73rM)EDyJ}-x1($34h7kUG1!Y6@{}^0gmqgvgLPAa+Y6K)BDol0E@Q`3pPKWNVa^; z$EV`pZGJwJ3}A>#92Rh3%Oux zxyF*ietaz*?t$>EeqdwwtCGWd)uh7#mc7;LRTnoc&_DCBCK=x9wJsSBu*`?mt069| z*TdX~d^xjk)Mn1}J=qYb8MaolretgkRCxd&mb{%eN&ttXU!*j(g9l88-iD Xa%|?<&0i`Rf6V(M?dbn0gNwrd^WgB( literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Traffic.vert.spv b/data/vulkan_shaders/Traffic.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..33f0b25ed0655e0ec6d42512756c66f5b399302b GIT binary patch literal 6048 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 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TrafficCircle.vert.spv b/data/vulkan_shaders/TrafficCircle.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..f72ca1041d0a1b28b6a7783b4666e4df3066dd62 GIT binary patch literal 5648 zcmZXW`Il5z5yv0&%&-KqvBnq}f=d*|KnO|B2m}%w)QK|*B=JOJPdnWW9h&a8XAy7% zV>D{SMB{E0#eIoe#ND7s5XGqffq#O(xtycN&*$|mc#L<>cdF`ptLoOhx88eQn!9#h zmd)XBarW1&H?GR&VrSW9*+4FbM|O{_pPZ_$-*oehdR(5Baz}lxz{}AG4pbT~^#?%( zoB+>&li&;}@n_6t{`F-Gv*D5Q@aX99$j+SA=8)oX8h7Qy>Z5pa?7{Vnp zb}_P}TW$}qw`5-k)32X>CjOpUrTKu|;_Mo@iAr-~gqkn7*Q(nOHYUf~lPtG!NL*O5 zpYvQsOuO6I+h|pq$uZBr9DZ_Nqdrxu65CsI1>Avlwbs0^QF}YOb*x10t2FEPH>y+n za&BIBEpjS$NqpK4-lgn1=6bQE%uRRlm{PVAS`llP2UKbH*2wR#9E{w&Y#g7$ z8c}*)lXqPyciNMUsYaU)aNWId_wE>F#{;>JnN623?q-0T`q&TCy3%AO1E-g^1^!d#B_OYw>{mdRq5KOqrb>+xX2F_`Hj7E zXvno1_6|29*OzsXjaIdGFt_{jvu)PuQ@b07>DFG{dyri5z95Zz49*kn`SfL;W-8haXjZ?imB>)u!EPUTz9&r#mtTwJ>MDeryee4`cHCs!$d{*7_3 zXOYFdpPOZ$FWAHQ+mEY&xwY*#ZO1Nb`^e$l?&5#gYjgHeZXTTPhln$0F;3gK+d<@# zn;mCw7UQ&yI|3q3?qXc8t`eMnr$G4Gt8#xSaORf#TYgSIs3@*-lF z;p-U;0>`>!uSR!I=3a+1w|30mgzj3}&TRpXu(#&ck!?%y8bPl#Y7eJ&Sv zCE2SunZ4+qL%_Hq%<1>QI`lP%b|Z1_?IH9*;2PGZy&pJ?Zz7G4^L`t;YxLs!vPpDf z-DAY}-h;jP!|=u%6Z1#V!(Vv}Ft)kgmr;7>*sE9jMB<$PQPRCP_oHp!8sq$rk=7IQ z+V-(rtp9AXSK)se-P)|f_}?MTC2xN1Gl`4%=dj(A{?Dhm*q?cPX0z<@ott@P^s{#z z=KUv(&#}3eApOo78}@j?_N==F+g|p&9sb&WSHd>mW3z0(DaCoeDPh~=epA9W-|>QN zKEEF^?=$7MplF{h*ycM|u+4Wq*<0AJac=?k^eC2hR8E|{!+YAwNqH{LMciA_DIwXLNN^mWeX(`Rx!IqZ4A!9FMZfi>9wEg=6mKE}6! zIpm|RPU4+&#D2!noiqO=(%+WuXEiXtbx#BN7PimVOyWEb`#@V?=MDim^ZAUu16Z%m zUYyxG6F7Bzkn-T0%a#!sQ^FCRXiM%QN%6bzqp6E4`rOo zSI{2>aV}p)mlO7F3B>dLHFW14!F?TF&b^Ou66=uP0Qx$&6?jMT-vrJT@A_NV-mUd` zj^75}y=Sle9iWeV4{qfA7@y&(A>x+yr8Ozes$X-!HL^a|HJ*bh+M{_THnv#@5$4 zb9k=NJEzd?oo9jTEI|GSoC5J4{VlpVp0t`dknyb`^)hXwgLuE&-$t`GEsxxllDGt?)}@Kxxu&+tY# z`Pl0Qbocrw+03&M=p!F_HldrR_&nW=E&oW0+l($}e8k;?9&y&EtzYc#)-?ZLcA*}< zcQv~2RmW0b?=3+tE9lFUZXd2lx_z?}*oQAb#_!G{^yowL>`byjP6GhUCak9_>jxC>q0efc|M6zTAHhI4NK_XE#bJ#vqs zTU*$7qr0}>Yiqp+xKBCf^t11F1Me<=SL{L8SN>?)=e_9Wcg~*Cc75xJ_1=i?`p&C6 RZ|!r~gX=$#=9Ko^{{RHqE2{ti literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TrafficLine.frag.spv b/data/vulkan_shaders/TrafficLine.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..79606bb3ccef5bba75e11beb9357adc101f8b8e3 GIT binary patch literal 1604 zcmZ9M$!-%t6h#X=wnIWDLM8%<2Sy=9fFMFbARvIVu;d^DEL$yiJ8ERRt+v|?D?W`+ z;1l=+mTZu?r|hyDDtdW!?;GmYt4{K{TFIDm`dKo!&3LVuoUk#Arf7Y=@wRa=7zPIq z9^NHm+2m~^IV+}Q=H#)iAN2^V$u?xG%7fPd+U0GpLlw=L1ygT$^=7l)c;&VFeQz-Q z(h0pz)C;{JO2XDK8inM|XY!(6tCI%Vgn}}%=Yr4ctXABK6ZwLEmgG~h+WOBkE&2 zhobaTpBu-bQ9L|N{NA7)CtXp~TBezL!^Cg5qt=O^_}#(uJnolzXGxs)!$8w_Itp3- z-i$A1`TOG;T!HIF96Qj~)O9cB!m4X#?5h^da7CCqk-MCU@wR&z%*-4jn3J9rMlBfvNi@b9HdDy0I?iPTqH!%VXYfKQbJ> z;eKW~<_z~s#*ExMGf(DSm9ZSIjG z_<}rfW|3VE@2cOT0_0JDVUh&*c!J&gbKZ)0`k{q<-h^K8!5 z`fbY754&ruRA%E}9-;%*K)t&imPdIoM_e9fkDMfo##yq%lSwf3C9^HQiP_PGU~}EPH(jH*2Mm(!z0;Wkgs|g literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TrafficLine.vert.spv b/data/vulkan_shaders/TrafficLine.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..646d0b686ac2f292f50694ea350b3f49baf673d6 GIT binary patch literal 3124 zcmZveZFdt@5XUb~lNJyJfr3vpr9Pn53L45o1=1Ew)o21ORqGAeV?)?9EX70?~Y1+cX{FHNt^mEMZxOAO#6T;3N zb){sl)i>&k!%=6ka`_?_$6X;Y#O6hJIMFBd*>42{z>?&?UX?$6nVqZ6~3KX!pjQyg^YG`8$is_Jr^bn8u|?EiVd(!6*pTHGFT1yT95{*Gq{m z=*C_@?D)N{z<(rmD>n*o)%uC%T2V)7f-#Hj$n^*MRgq_2uQpp0et8gLbnOxBA0p z_tDR>w-bls$nWT-EstWJzqHSn^880>T~)Y2K;KnqTGzUERjL|G$z1Gu?XVZdoBrNf z7{;B1XI5JO!+$G&r{^{Oc*~DR{+?ix7d(qIYa;!Dr#}fF3`QHl6HQZ^2eZiH{eRFN zQGSNK19&@!YqICPW+kk3Vcv>GZ`So`cs^mD=kyDf%%=H~U)~RlUsYnU;12rnws}7= zeorOl2e*W_G2CC0S~jEHK~JjM&r4W_=Tewpz5}dh zob$$DY9kMO!=u71<2Z+7=T7Xn^OQc>=fo8gxGoEj$7imA6xDKS0!-NxT3u* zu{*)55*Gez+Of6XeJ&kaaw8|~n;D1wrgZA3M(zVMBXFE=X~*Br!ORTYtj?JOdmHQ@ z2;&P+JaGE=X8->0#gQZS9qrf?!+O@0?%b2xOPWXQm1aQwcHPEw5U}bH?Jno9Yn#;EY)0|Ct1i z`8V?!Nv3B1+trF8sQ#(gCnE?-we7+cPWk+18na8<&rSzY&}!&_Y&(uo02 z?z|nG<^GLyW{opu63iJr`B8#BXS^}kdiqd$Rl=Ov-7V=4CD=0qVDxS6yveoft=iI0 zNQj9Y=fq`BeF?L?D!~_w{Xgo;RSEM-ZuqnKp1LAC=92$y(3!#Gna=$2zYH^dQoGGC z|H}{ujLqo`TkWTWiAN6Dg2@rvvl6%&3HH42ISD-W!~$DiUY1Ti7W-A{_}iSlCLIo8 z@%|R~b?M}9cvd>`ZD!t(jz7z|vUIro9L))1Tb2-$IKO4RJTILbv1zE2^V;8(z#}YT z6(m-}Thh}S4kvwlTNn<%Nl8&MA)z=7f literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Transit.frag.spv b/data/vulkan_shaders/Transit.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..30ce030e5c20d8045ff5815b83d6afabfc8a188f GIT binary patch literal 1324 zcmZ9MOK;Oa6oscrla!W1OQ8=6C7~N6qza@`Kotn_au*R@P+)0Uu^Sm2JF??YSn<>N z3H%&3AkH_=6vI?EGw0lM=RPKBv$5MTW=?<0rfaITY8t}EESa|5z5d(&UNH&x_8;6s zamh5T5Y1)NG4tB7Q4ps%R%L6l73tuWK&Pg?>p(&CX3=|ZkAF}*YkY{BY z-kF~6A4)^)qV_?SWVyvHTlds|od?4gmPJD!Q@>JyuL_TYJQ&%SrrFf~?)kAM)wX9r zQ~IMUjFR_p^jU1j^31CA$9eXV?lL>4w)!K!QTgI&HaW?Iv^dRju0Ow%X_x*`^^c=a zFW_>~`#FD~o?7NQTpDvlp`+z?tj_ju5}g_2sSn-=o&}~)hmVA*i`9}H>C@p|%l^yp zzAIK&#nEd$4ouuLnY#<_|2XDQj{_6;P3Gd@{>D{xF&}i_WlqOz;C{$FefQj)>6IDX zma!b}RnThP9Pn|jYr$x#e@!n(Jw5yFuHJE7=eD@6Y(w$X3Z|Z}J{PpZVLjmsvokz? z=14#I4`-OSg2R7B`<%@A!Mq*Zru-W-ANh8qqHj27E;n~=iKl)vb|42qYbZA)2{h@T^;r{@+FKTzWmS_BL@tnEi4;oQ) ADgXcg literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/Transit.vert.spv b/data/vulkan_shaders/Transit.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..2f62ea8bd370ccf40a5bf879cf9399ceef8abf3a GIT binary patch literal 4624 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 NtpkC7DV{Ys{sHQ6wYC5N literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TransitCircle.vert.spv b/data/vulkan_shaders/TransitCircle.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..d0eaa9d81626dec2fc02e017d51cbe82e45024ef GIT binary patch literal 5100 zcmZveiFaL96^Cz{p``;;M?^|O9nfl}5DKi=LMt^zqY0G31>(zV-b;J&HShWI5@~U0 z#o8*0px`{jQmYjwWN;q-1pga{wRHJ?_nn>GzU9gKlWCYF~RWzo<`X`aCV;l3aYGd}1yw*8ZaI3TH znLDvd;?s8U?$2((){X7Y+;ppm>CX-_*9v(cdyILG1FAN(QUNOz+QLQ0MZz=OyH$jmlKL{cyeAsk>BBpS(j`9GGXZ1m{^4d_LDXoS&?t7H8>m zr>TJM8Cg* z@UuVU{tm`duNv!K?US2;BlMB3TEs6Ux%<}Z=9IH$IcIY&F-K1CpnRU*fqK||H^%vH zgq0s5hqWtjK^kHn23x7oJ*vBpVg9dSmJ{31uSjy(*Ct(Ff9s4KBV<~ibo1z|-F2>I zb{%UlZX>gC@*_x_k}NMGb~C>2XBaqkCjCZa_hjy!%;r`P`)$asrLJu+aD=|E&`#aG z39kucYx*d2AF!^mq}#u8+N()+J?-j861SZwd)IRbm`50!Gh2^7#;V&Na_;ft%)_7$ zSfe_x&|(> zwVs!NYncD#WQ(&>w>R~Vv$Hp?LH}PT+sU#~&KC@o${B__^x6Z#5+R1zO z@bp@Tz7E&?CydXuYui75hoUz1=^oveXxVMCEZ^4eI5DKFO+oS zFP3!UFC~31^&0mvV6RQ0`Ak$2C-3ka_pwv=rOi0cat0g$5m!r`yu-NrIT_Ed4zxRh zn?;t>Z;G|8_e+pTo!a7BGi=)b)wPYjebYrjfOo z%YCE@J)Z~WH~_Rot}h@@18cIM)s@dOn>X(8i^#oq_$4@b{q1#iW&7Oq?&8bf z-oFg|t!jSr>Z^~w)6Clc#W}}$J6oT9@fGkmh@N;haq_D`KZv{dD)Rrki|63A#a%pK z$oAgKIeZOy8pN4?9a&D_s8cS^?M38i;Q9F8{3bX8ZUg#w=HCMH@!WhH**HgV-$9o1 zZsJ+`F0#Jb%u#-pzK`x6eJ{I?&(aTod^}4(L^g-Kwfmlti!=Q(vYfUH%<6H^KS4JC zOCa+96j@&Xi_GfEmzej0yV5)0XUJCrbLywvye~8V9GnLYV63|SQPZ!GefMkgo1h-H z-yoNJ;8k=v(c1%Wz*+xm;B{aQ@8Y*WTb%pvkj>)=?)S)Y-Mbhnp36U=>#NNi(QAK1 zcAehm{!eh)>@}b3KLc~fySG;o_a9cd6Zl=S&pkKCdTTRYBQ&Ko=<1_PGoD;XOh$L z9^M7yg~MF^AolQXD9&*gx}0$XU=Y}A_EMaoK5>TcLGC@nTj1nlue*`m>p8NS z=T@MPeB>ELHc$CIayz>GnH0ANS!2EA5LFw zdx7snbJ~vwfOWG50SgXsFm$8V7jAoPdq&;$ts~a^2(s&ISJrOreeA*YA5AuA G`|W?${oSGf literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TransitMarker.frag.spv b/data/vulkan_shaders/TransitMarker.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..468307de0dc0f3287ea4bfcc16df9651512728af GIT binary patch literal 2476 zcmZ9NYjYGu6o#9G4KWGIMQ)O^xpEY|ZQ}!B13K z{sVuIKf#~l7bxGSr%xPd>ZH&6_IpmBKHalSPo3H4+#dbg@1D7O9CTB{&ds|SKS!Ns zouzWzU0S|+5yks%+6&Qq;AY)k&DbExhAbSC9ha@k4oJ(IHjy{&^Q|awubXpGCyq8Z zqt1hPYcz_>@vD9s_p@Odce5hh8fTLf-E2db4Y&GLw<%~z(cHVGs^_&=nGDKmxElV~{4B(7E9qryef z&8m_dEq~TYocDTVIu_+Q8Z}6Eo(7rcE{jW&UCMLI;>vM4dXe-i9oKX8Z4$2+$#z`? zdq(0$Ns$b^X4?Ir`KP;^x}h2G3%V*EP2-RF7ksES8L{tF$={r$|Sr^HXy zYuO|pKQEGD*~<&k@8;x|t9V;I8>L+x$o8V&yZoiP=0|YDj1;uMpW{cb^L=}s?l_&H z?&T@*)CK09fEi%UZg@kOIvFk5hW;8pgmIebFD$j28Za zFl)zT42$Qki9e$C6PnvH272&E9@Y6y%128cTmMwP?f02{_G_-66(+{?U&`lBte#8q zoqN4%_=-@k*IT9j2lCO{dBN*}JFfNb!y5fNB^CDwXGR=Gu8wBvM8ny^+%?<@b^5Vp z>ZaD_Fnm&#Y-#}=`JMz39QnZ9Kf})Q)T7_-uju8n4|Os)(?4Q(&%|=Sd?R*F?v39w z!}RsyJDA_C<~qMwhRGKNd`tP^56gHfx3xQaf$yjS?(}0B?|{2TPai&!!7m7b?e~E* zux7Ds`NZ-LEOt?TTlTy16MI@lJp6*Hf#dtzBRenSO`;(uXZ>8p`KgC`!RT$zbMo2q ztjzW#54_d;g?#c;FKZTiK|Zm(LyP@NKD^cYwS3~?t==X1&3e&Tz2C^EUh1J?Zo$dTB46g+IN9fx%VKnfjxh|iahHnIHG2aTKfk(r)&;P5`XZX8-{|x)w z3L5wYy+-cmwv6*qJ9Us39p~V!v2N#ImCu`M_H<1c-s-#~pE&FBUHRmOx7zQ?Uz4$B zx$n!j-0TfTM_%6bMp$Pp3iyW3#o9yJybPZ8^}xN+$*#-zF43W3@Oyhrx>?P0GQQCT P&9>M6z`qrbPmX^94u`&1 literal 0 HcmV?d00001 diff --git a/data/vulkan_shaders/TransitMarker.vert.spv b/data/vulkan_shaders/TransitMarker.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..fb8164b7b52665bd61f7f06dc27461b1673d1db5 GIT binary patch literal 4104 zcmZved3#e;5Qi__+4n`%+EN!3MR+WWR`|LEiU-rRxE$J1vrGrw8RnK^UsZF}25cakjPZ+Y@Z(p;;PHuNM}nslW+H*#WR z`*dSs`{1q}daOv=Q%8MP;^pdqCJW^$25&S+LLwgi<$fqyjGn~^Vpk09orRn4S7V?2Ku@czy`Esd2FDRF|uHDI+AM(^tlE4JbJZMnl3h) z_uyR4<^wT*M>?mo`SEI{T2FOnwvg#L?A~23l|_wYRtIo0jIy8dhVmG_gwT9h{+b;0|fjrd!$ zx^?yO+XEMqHlZ)hSk8&KiQEW^?ZccOQMst?u25 zS<5iI4~o6i4?r&C55o109=(BVerwcz1a7RD`PGkRSk(F^x=a7J;QCvW_F?!tkiF49 z3U|M-+v^jMG2!pKTD=#4=PB;Y_)F;K68Ajneutv>!^l@4_t5_aTw9!9{Z@t0aBdDk;&<>d{xD^7h2uh3UP=G0HSd2hhKhAyXiGge*yIMX-C&R*Qjx5#2r8`KUh_@ zS&0&l_)^-c7Eo%D>`Cex8yQ2ONnf5|{Kb&>%!L*^UGPni zxc=r+*XH~_0(qXu{V1~WF$<3&i%Bkf7I_~>_WYsuBAY+@`~4PeS67%UsTA)bJE?vxdcKAD>1SGtRl~gq%Zr6Ft-?diV_T z!X9n~6OUS-MYh(PWHZlmkUrv(=XqrFY=a{11!VDfS8qoaGd|*8M2= 0: + found = True + continue + if found and line.find('}') >= 0: + break + if found and line.find('{') == -1: + line_parts = re.split(',|=', line) + name = line_parts[0].strip() + if name and name != 'ProgramsCount': + gpu_programs.append(name) + + return gpu_programs + + +def drop_variable_initialization(line): + equal_found = line.find('=') + if equal_found: + return line[:equal_found - 1] + return line.replace(';', '') + + +def get_program_param(line): + glsl_found = line.find('glsl::') + if glsl_found >= 0: + return drop_variable_initialization(line[glsl_found + 6:].replace('m_', 'u_')) + if line.find('float ') >= 0 or line.find('int ') >= 0: + return drop_variable_initialization(line.lstrip().replace('m_', 'u_')) + return None + + +def get_program(line): + program_found = line.find('Program::') + if program_found >= 0: + return line[program_found + 9:].replace(',', '').replace(')', '').replace('\n', '') + return None + + +# Read hpp-file with program parameters declaration. +def read_program_params_file(file_path): + program_params = [] + programs = [] + result = dict() + with open(file_path, 'r') as f: + block_found = False + for line in f: + if line.find('struct') >= 0 and line.find('ProgramParams') >= 0: + block_found = True + program_params = [] + programs = [] + continue + if block_found and line.find('}') >= 0: + block_found = False + for p in programs: + result[p] = program_params + continue + if block_found: + param = get_program_param(line) + if param: + program_params.append(param.split(' ')) + program = get_program(line) + if program: + programs.append(program) + return result + + +# Read GLSL-file with common shader functions. +def read_shaders_lib_file(file_path): + shaders_library = ['', '', ''] + with open(file_path, 'r') as f: + shaders_lib_content = f.read() + if len(shaders_lib_content) == 0: + return shaders_library + + common_index = shaders_lib_content.find(SHADERS_LIB_COMMON_PATTERN) + if common_index < 0: + print('Common functions block is not found in ' + file_path) + exit(1) + vs_index = shaders_lib_content.find(SHADERS_LIB_VS_PATTERN) + if vs_index < 0: + print('Vertex shaders functions block is not found in ' + file_path) + exit(1) + fs_index = shaders_lib_content.find(SHADERS_LIB_FS_PATTERN) + if fs_index < 0: + print('Vertex shaders functions block is not found in ' + file_path) + exit(1) + if not (common_index < vs_index < fs_index): + print('Order of functions block is incorrect in ' + file_path) + exit(1) + + shaders_library[SHADERS_LIB_COMMON_INDEX] = shaders_lib_content[common_index:vs_index - 1] + shaders_library[SHADERS_LIB_VS_INDEX] = shaders_lib_content[vs_index:fs_index - 1] + shaders_library[SHADERS_LIB_FS_INDEX] = shaders_lib_content[fs_index:] + + return shaders_library + + +def get_shaders_lib_content(shader_file, shaders_library): + lib_content = shaders_library[SHADERS_LIB_COMMON_INDEX] + if shader_file.find(VERTEX_SHADER_EXT) >= 0: + lib_content += shaders_library[SHADERS_LIB_VS_INDEX] + elif shader_file.find(FRAG_SHADER_EXT) >= 0: + lib_content += shaders_library[SHADERS_LIB_FS_INDEX] + return lib_content + + +def get_shader_line(line, layout_counters, is_fragment_shader): + if line.lstrip().startswith('//') or line == '\n' or len(line) == 0: + return None + + output_line = line.rstrip() + + if output_line.find('uniform ') >= 0: + if output_line.find('sampler') >= 0: + layout_counters[SAMPLERS][1].append(output_line) + else: + layout_counters[UNIFORMS] += 1 + return None + + if output_line.find('attribute ') >= 0: + location = layout_counters[IN] + layout_counters[IN] += 1 + output_line = output_line.replace('attribute', 'layout (location = {0}) in'.format(location)) + + if output_line.find('varying ') >= 0: + if is_fragment_shader: + location = layout_counters[IN] + layout_counters[IN] += 1 + output_line = output_line.replace('varying', 'layout (location = {0}) in'.format(location)) + else: + location = layout_counters[OUT] + layout_counters[OUT] += 1 + output_line = output_line.replace('varying', 'layout (location = {0}) out'.format(location)) + output_line = output_line.replace('texture2D', 'texture') + output_line = output_line.replace('gl_FragColor', 'v_FragColor') + return output_line + + +def get_size_by_type(type): + if type == 'float' or type == 'int': + return 1 + if type == 'vec2': + return 2 + if type == 'vec3': + return 3 + if type == 'vec4': + return 4 + if type == 'mat4': + return 16 + print('Type is not supported' + type) + exit(1) + + +def get_subscript(offset, param): + symbols = ['x', 'y', 'z', 'w'] + subscript = '' + for i in range(0, get_size_by_type(param[0])): + subscript += symbols[offset + i] + return subscript + + +def write_uniform_block(output_file, program_params): + groups = dict() + c = 0 + group_index = 0 + group_params = [] + for p in program_params: + sz = get_size_by_type(p[0]) + if sz % 4 == 0: + groups[(p[0], p[1])] = [p] + else: + if c + sz < 4: + group_params.append(p) + c += sz + elif c + sz == 4: + group_params.append(p) + groups[('vec4', 'u_grouped{0}'.format(group_index))] = group_params + group_index += 1 + group_params = [] + c = 0 + else: + print('Must be possible to unite sequential variables to vec4') + exit(1) + if c != 0: + groups[('vec4', 'u_grouped{0}'.format(group_index))] = group_params + + output_file.write('layout (binding = 0) uniform UBO\n') + output_file.write('{\n') + for g in groups.keys(): + output_file.write(' {0} {1};\n'.format(g[0], g[1])) + output_file.write('} uniforms;\n') + for k in groups.keys(): + name = k[1] + params = groups[k] + offset = 0 + if len(params) == 1 and get_size_by_type(params[0][0]) % 4 == 0: + output_file.write('#define {0} uniforms.{1}\n'.format(params[0][1], name)) + continue + for param in params: + output_file.write('#define {0} uniforms.{1}.{2}\n'.format(param[1], name, get_subscript(offset, param))) + offset += get_size_by_type(param[0]) + + +def get_size_of_attributes_block(lines_before_main): + for i, line in reversed(list(enumerate(lines_before_main))): + if line.find('layout (location') >= 0: + return i + 1 + return len(lines_before_main) + + +def generate_spirv_compatible_glsl_shader(output_file, shader_file, shader_dir, shaders_library, + program_params, layout_counters): + output_file.write('#version 310 es\n') + output_file.write('precision highp float;\n') + output_file.write('#define LOW_P lowp\n') + output_file.write('#define MEDIUM_P mediump\n') + output_file.write('#define HIGH_P highp\n') + output_file.write('#define VULKAN_MODE\n') + is_fragment_shader = shader_file.find(FRAG_SHADER_EXT) >= 0 + lib_content = get_shaders_lib_content(shader_file, shaders_library) + conditional_started = False + conditional_skip = False + lines_before_main = [] + main_found = False + for line in open(os.path.join(shader_dir, shader_file)): + # Remove some useless conditional compilation. + if conditional_started and line.lstrip().startswith('#else'): + conditional_skip = True + continue + if conditional_started and line.lstrip().startswith('#endif'): + conditional_skip = False + conditional_started = False + continue + if conditional_skip: + continue + if line.lstrip().startswith('#ifdef ENABLE_VTF') or line.lstrip().startswith('#ifdef GLES3'): + conditional_started = True + continue + + if line.lstrip().startswith('void main'): + main_found = True + + # Write attributes. + sz = get_size_of_attributes_block(lines_before_main) + for i in range(0, sz): + output_file.write('%s\n' % lines_before_main[i]) + + if is_fragment_shader: + output_file.write('layout (location = 0) out vec4 v_FragColor;\n') + + # Write uniforms block. + write_uniform_block(output_file, program_params) + + # Write samplers. + samplers_offset = layout_counters[SAMPLERS][0] + if layout_counters[UNIFORMS] > 0 and samplers_offset == 0: + samplers_offset = 1 + for idx, s in enumerate(layout_counters[SAMPLERS][1]): + output_file.write('layout (binding = {0}) {1}\n'.format(samplers_offset + idx, s)) + layout_counters[SAMPLERS][0] = samplers_offset + len(layout_counters[SAMPLERS][1]) + layout_counters[SAMPLERS][1] = [] + + # Write shaders library. + for lib_line in lib_content.splitlines(): + shader_line = get_shader_line(lib_line, layout_counters, is_fragment_shader) + if shader_line: + output_file.write('%s\n' % shader_line) + + # Write rest lines. + for i in range(sz, len(lines_before_main)): + output_file.write('%s\n' % lines_before_main[i]) + + shader_line = get_shader_line(line, layout_counters, is_fragment_shader) + if not shader_line: + continue + + if main_found: + output_file.write('%s\n' % shader_line) + else: + lines_before_main.append(shader_line) + layout_counters[IN] = 0 + layout_counters[OUT] = 0 + layout_counters[UNIFORMS] = 0 + + +# Execute external program. +def execute_external(options): + p = Popen(options, stdin=PIPE, stdout=PIPE, stderr=PIPE) + output, err = p.communicate() + rc = p.returncode + if rc != 0: + for line in err.split(b'\n'): + print(line.decode('utf-8')) + + +# Generate SPIR-V shader from GLSL source. +def generate_shader(shader, shader_dir, generation_dir, shaders_library, program_name, program_params, + layout_counters, output_name, glslc_path): + output_path = os.path.join(generation_dir, output_name) + with open(output_path, 'w') as file: + generate_spirv_compatible_glsl_shader(file, shader, shader_dir, shaders_library, + program_params, layout_counters) + try: + execute_external([glslc_path, '-c', output_path, '-o', output_path + '.spv', '-std=310es', '--target-env=vulkan']) + if debug_output: + debug_dir = os.path.join(generation_dir, 'debug', program_name) + debug_path = os.path.join(debug_dir, output_name) + if not os.path.exists(debug_dir): + os.makedirs(debug_dir) + execute_external([glslc_path, '-S', output_path, '-o', debug_path + '.spv.txt', '-std=310es','--target-env=vulkan']) + os.rename(output_path, debug_path) + else: + os.remove(output_path) + except: + print('Could not generate SPIR-V for the shader {0}. Most likely glslc from Android NDK is not found.'.format(shader)) + os.remove(output_path) + exit(1) + + +# Check if varying are in the same order in vertex and fragment shaders. +def check_varying_consistency(vs_file_name, fs_file_name): + vs_varyings = [] + for line in open(vs_file_name): + line = line.lstrip().rstrip() + if line.startswith('varying '): + vs_varyings.append(line) + fs_varyings = [] + for line in open(fs_file_name): + line = line.lstrip().rstrip() + if line.startswith('varying '): + fs_varyings.append(line) + return vs_varyings == fs_varyings + + +if __name__ == '__main__': + if len(sys.argv) < 7: + print('Usage : ' + sys.argv[0] + ' [--debug]') + exit(1) + + shader_dir = sys.argv[1] + index_file_name = sys.argv[2] + programs_file_name = sys.argv[3] + program_params_file_name = sys.argv[4] + shaders_lib_file = sys.argv[5] + generation_dir = sys.argv[6] + glslc_path = sys.argv[7] + + if len(sys.argv) >= 9: + debug_output = (sys.argv[8] == '--debug') + + shaders = [file for file in os.listdir(shader_dir) if + os.path.isfile(os.path.join(shader_dir, file)) and ( + file.endswith(VERTEX_SHADER_EXT) or file.endswith(FRAG_SHADER_EXT))] + + programs_order = read_programs_file(os.path.join(shader_dir, '..', programs_file_name)) + program_params = read_program_params_file(os.path.join(shader_dir, '..', program_params_file_name)) + gpu_programs_cache = read_index_file(os.path.join(shader_dir, index_file_name), programs_order) + shaders_library = read_shaders_lib_file(os.path.join(shader_dir, shaders_lib_file)) + for (k, v) in gpu_programs_cache.items(): + if not k in program_params: + print('Program params were not found for the shader ' + k) + exit(1) + if not check_varying_consistency(os.path.join(shader_dir, v[0]), os.path.join(shader_dir, v[1])): + print('Varyings must be in the same order in VS and FS. Shaders: {0}, {1} / Program: {2}.'.format(v[0], v[1], k)) + exit(1) + layout_counters = {IN: 0, OUT: 0, UNIFORMS: 0, SAMPLERS: [0, list()]} + generate_shader(v[0], shader_dir, generation_dir, shaders_library, k, program_params[k], layout_counters, + k + VERTEX_SHADER_EXT_OUT, glslc_path) + generate_shader(v[1], shader_dir, generation_dir, shaders_library, k, program_params[k], layout_counters, + k + FRAG_SHADER_EXT_OUT, glslc_path) diff --git a/tools/unix/generate_vulkan_shaders.sh b/tools/unix/generate_vulkan_shaders.sh new file mode 100755 index 0000000000..4e3ff7d0ab --- /dev/null +++ b/tools/unix/generate_vulkan_shaders.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e -u + +# Prevent python from generating compiled *.pyc files +export PYTHONDONTWRITEBYTECODE=1 + +DEBUG="${1:-empty}" + +MY_PATH="`dirname \"$0\"`" # relative +MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized + +source "$MY_PATH/../autobuild/ndk_helper.sh" +export NDK_ROOT=$(GetNdkRoot) || ( echo "Can't read NDK root path from android/local.properties"; exit 1 ) +GLSLC_PATH="$NDK_ROOT/shader-tools/darwin-x86_64/glslc" + +OMIM_PATH="${OMIM_PATH:-$(cd "$(dirname "$0")/../.."; pwd)}" +SHADERS_GENERATOR="$OMIM_PATH/shaders/vulkan_shaders_preprocessor.py" + +python "$SHADERS_GENERATOR" "$OMIM_PATH/shaders/GL" shader_index.txt programs.hpp program_params.hpp shaders_lib.glsl "$OMIM_PATH/data/vulkan_shaders" "$GLSLC_PATH" "$DEBUG"