From a4aded5854ea516575e9bbe63f63dc15e27f01a0 Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Fri, 27 Sep 2019 08:13:35 +0200 Subject: [PATCH 1/8] add .gitignore --- .gitignore | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ec0a6d --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# build artifacts +build/ +visualization.*/addon.xml + +# Debian build files +debian/changelog +debian/files +debian/*.log +debian/*.substvars +debian/.debhelper/ +debian/tmp/ +debian/kodi-visualization-*/ +obj-x86_64-linux-gnu/ + +# commonly used editors +# vim +*.swp + +# Eclipse +*.project +*.cproject +.classpath +*.sublime-* +.settings/ + +# KDevelop 4 +*.kdev4 + +# gedit +*~ + +# CLion +/.idea + +# clion +.idea/ + +# to prevent add after a "git format-patch VALUE" and "git add ." call +/*.patch + +# to prevent add if project code opened by Visual Studio over CMake file +.vs/ From 7eb7e273b8cf81bb2a3bdfb3f8e85142f2f4dcf0 Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Fri, 27 Sep 2019 08:21:49 +0200 Subject: [PATCH 2/8] change description text --- visualization.starburst/addon.xml.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visualization.starburst/addon.xml.in b/visualization.starburst/addon.xml.in index 8c6be4c..579ff1a 100644 --- a/visualization.starburst/addon.xml.in +++ b/visualization.starburst/addon.xml.in @@ -10,7 +10,7 @@ library_@PLATFORM@="@LIBRARY_FILENAME@"/> StarBurst visualizer - StarBurst visualizer + Frequency giving stars burst. @PLATFORM@ From d8f5406abbbf6702be2e8cfcf1c6b7a67bdf40dc Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Fri, 27 Sep 2019 08:56:26 +0200 Subject: [PATCH 3/8] add icon, screenshots and fanart (also screenshot) --- visualization.starburst/addon.xml.in | 7 +++++++ visualization.starburst/resources/fanart.jpg | Bin 0 -> 32186 bytes visualization.starburst/resources/icon.png | Bin 0 -> 55353 bytes .../resources/screenshot-01.jpg | Bin 0 -> 44358 bytes .../resources/screenshot-02.jpg | Bin 0 -> 44194 bytes 5 files changed, 7 insertions(+) create mode 100644 visualization.starburst/resources/fanart.jpg create mode 100644 visualization.starburst/resources/icon.png create mode 100644 visualization.starburst/resources/screenshot-01.jpg create mode 100644 visualization.starburst/resources/screenshot-02.jpg diff --git a/visualization.starburst/addon.xml.in b/visualization.starburst/addon.xml.in index 579ff1a..de3defe 100644 --- a/visualization.starburst/addon.xml.in +++ b/visualization.starburst/addon.xml.in @@ -12,5 +12,12 @@ StarBurst visualizer Frequency giving stars burst. @PLATFORM@ + + resources/icon.png + resources/fanart.jpg + resources/screenshot-01.jpg + resources/fanart.jpg + resources/screenshot-02.jpg + diff --git a/visualization.starburst/resources/fanart.jpg b/visualization.starburst/resources/fanart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1cce8c86251e46448dc35d2f798ec171acae11c8 GIT binary patch literal 32186 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

`MkUHDL23pWfeMbb4N~`c5xjfb#%K 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 SYF@TYA#|B&25!Q2BlfUW-)z#9=* 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%0A{|QS{?8Tw5WotvI`JlvX`3mt#{? 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 arLj1?Nfe04eT_Hg!QVKDddP|W*81PAR$s6H literal 0 HcmV?d00001 diff --git a/visualization.starburst/resources/screenshot-02.jpg b/visualization.starburst/resources/screenshot-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bda40d2dd703ff99cb12977aaf789412ed5a5e99 GIT binary patch literal 44194 zcmeFZcU)7++BhCiT(4_m0Sh3wcm+g-#ZaUMR|0p}0CFKjN?-*A=}VOkt9PXdxhx`0 z2piS_0m1@8gn+C{k($LALq|HH_Y&G~&I!0~@xJBz*YERrN0~G2%slhVJay(|t8MEY z;_%mcU+E$E`1ld0!9T=SC*m^V)4hB5?fvA_eSh0`VE?BF1jRoSJakA<>bR(|_?f?- zm6QFujLi89I;!Wt(E36~<|0N->oWQuU;X2(iV@aO&s0bMA84o(zWoOd2p$sr{IkzK zN6X8|qyNWY>lcLJ-rbl_9_-?iLhuXn?GohMsz!(bQ27wMz~B48C$MYx9{x{2rT$?) z1m7;cU3)&=14{V$cY!SbuH6EHA|{`GuITYY>mFex$Vm|-^R0|?di1pYgxiTvgT>~s;B7$(mOH!}Upxoh9 zBDN)klv1i2QcoIaHB=h(GH9Tr*gCWd7FV*Gn_rbA`$ow(nFuu_nB7k$81t+ix2{7D zt7Fr))8fyRZ3-(qS6Cr0TubQRY7s|rE4JIz^r!_nRoVI9^q?FlrMZ1lyuNrlmA0#W zGl1SkuTzM@P0;Jk#$0tR{{3sUJ!)1?F#`#;*(&Y7AI;8PoT{uh+c01%<}$?tK$X{R zAuSdsn&~$Ljdc6>BXxo?j4M2!vO=DhwoLxA6q-(*_k98@+cA7-V!Ju79sn9@IXxPvB9m9{@% zeHz0048X^&PP^ZOPN=x>^tJnb2upv0q7TB-aVy6Ie;NsZE)BZ-D)Z0qLB&v?A0LVO zXUIW+XL&E#{2shGP+A1QJC~xu{{5V8K&7cK&qhnflq~;lzqE@%r85ov^_i~0e?T8V zLVrEf=dI2^kL35!kybe5z^bOXl54^5spHk`dipsk?=9Cqz-L4l zoV@|nr>MOB!+cjZjgA;ef=+*$a{m1$D+&sgiI#!hZ0-8!TbX6~zXzip8YUeTUlXtI zW%+xo$3t*yf=;Dlhf9A?a58msenox&6oV7Z9|v9|rSlJ4ng~G-qvN(R?f1*24Z#3) zd+YxuHa30Z{W|}L6}wXU(Pa_)_~!V(m$s?o{}Azihya?*2YmDYXFK8)#4g?ULt^63 zV)1_=tn_~qJAd6DkoSKjW+5%$uZ7=#5VJgeRtQ48th)jqNAU3?W*>g2=rS-y z6cb2)cYeoKJEo{Qk|=_yo?Q5);G$a5M6EV{Tv5X|YFJ9g)zR8Da|=;aFwyWP=-INR z4JI?5Y@W0!N1=q`iS2PY{=rj)XDR$)h>RUW3#38dCq?WOAP^_vBxU=#k3TF5YO!6P zaR<&K?u3OQ_U)D3n*r6yfj_92Uv@8lHa{XmDh#prP83NN)XO12o0AB{zU}uB2&u3; z83@n~?_U@KybOhtFibnczVw}LpVU7!(m_4NnQeq!=UNOLSTTzc9XqO1tR-5Ou~66f=~+nLjhppB%F{%$O4ez zBoE_o5)|-<@k$X=cSvC;Gr&K%28y;T5QwO4tbnP5+I<<@btkjop#XZb5eTh4@q=dE zp^=`uU(KBj_7qIa^MAeka^V+e3Gd38jW4817J8Mhtvt)I9n-c6%r7CYQtE0JuN*a= zTkE#PnHuYWJ`o5$9YJ0Kf!KW&E`g%m@5_Y+_=MqN9Vq65V<^Q7yAi^0(NzSWfG$*o zJ$&^rcz|*Q!j#wMzl?>^d;)wst#pfXG!|C(tC|=4c(hOK@^GJOeNY z!0`L|!M*)O#HRz^7l1m2f({(>@`5_Q!vTz7Fc7Ge;4S?8^rfFxMV^)IZG5ZA3GCy3 zqfAh@UI|GOwBWj@4vzuU0tPT`>9EZJQ~(1Ac+TRx z3U4Id=wQ&D83-T*xA7pb{Y3D=J9`^W(3H31-=hvpiH}d`lFlWt5d?OlA=ChJxFoz= z5afAp{kFZgd-?6bCjwsjEqfJli3iCx9(IdBbzr-L0Ko$i(0+ix<*R~M{TtNNid;mU{Deft{1K&F#DsS4G}W7<36w2pR$OZps^8 z1dIU%zTes*5Qjm5fbkAPKwQ0~0}2Fnz?44-JGn~$A3AXPZjlera24!dQ@|Q_=o_@y zp6dHP1RxXus)xseHX0b&6pCRu4idy|Ld`^jO+}kOGwDc!U-rk2{LlB&;yn| zZ~-C%R6v0rA65`p}8Na;;*MBtPm*xM9ra*$q!4eWkP}#j7z8tj=7I+XC zPzVEmkVJ$zKPUw4fgH?0@Yem>feo2g+5dt4i2;6J>6*69{yHG`_gQ&{EDxeE*&X4> z6FnIKA}~oXB5&Mn84d=|0K@ZVM8P#5NOoTSKgGPxem6nT93b$$P>cez1Hu-p1RVCt zg6V+(y#nhIJWv2+P-1U3c*yp?4vLB```>K+Nc>e{V_^i?RXgMj`h)fuMD9C9AP@E_ zDAWN70f@&5Kzo0i2LXbGsS?zodDO@UXkeRew`;&&g*t@-uhX3zuMCa>S2WiBjY)!C zzC#p%c0ddGm2D0P<#);eG4SaDo@eUQ2=jmw9~b>Fx#t&eOG0=n-1vIz4!|KljL&Uo zGWbu*f@B6_-}V9{WW#t>`@+C(hmsixutrdV|IR+%c8>bPt_I5pmFy)&@FV0RpiK>J z)a_Nx06p+@8K{pB!ajJL0|gPNh#5QOJVg(2G8=-5*8@xvC!uT@h@eCm;&;0M{ZR$r zFDZZm=ATUh-M|6rl>g32kOrv?@Bo2V$sZ&dspaJb8_lKVLY@P`ELsZ{O!E2#{uNBJNhqgzF|}@hTUn|NoPw~5=&1_W+dygrk+jcmq| ziQdbFHdL&EGE<2qh((G?%aE**)-z_gnt5sJ$&_9LGrM%hn1B40C({uoNLc&{Tr@^0}fGUjv!NbA_<_J4Y4x7TH z4a+7zVIJW_G718 zI1ppe#VR^KSRLFM$5}SYU*H;+_pNvaY%)+XN7nn--}xfHb?2;#T&pKJQi-pFXU3lm z7N2=KXM=zQ9Bf7MgFSbW1aiRqiUMU|?%)AiV(_MeNP)*_GEPF(e-R+oa|a@flfP90 zsR?0>$62D_(V$wGgm^Lq%JgUsMEd1@}em`k^K|S#`A7KAAG)RU{?u?(vQs-CwGCTZ%YK)$fYj z6b%mcoL>~54?j3Q-B2MS05FXbw0En@BMrHRla`% zS>e5S0x4-)w+5VG6YI+Q2FUU7k&e=s_@8#DYDS)0A&r$vgBH_a){Yu;Tn zoPqM?cBYU2xA?%=phsS)?$s~4*+F7-GNz}nbV{Lssc#c_fGeSm@mHLBvEt`hJK$q{ z=?QN-AE=4ICV;3wc=uJH+rnX64+QDM0#}U%1q1-SUA=S_(A`x&NT_`f&AMbV!Em)NLVDtF+ zqL!<&30@J46fsdOm6l1dNgFRXJ-9xc^|JG2XJ?;|A3hAWw)o`8a%9`=$jIR&;+4Ab zo_)>Y75VCEPv%*8B5pk}z4~_F2qRp6!kqE92dogZqN0Yh3g(c1fuEu~Dj_aX&|QX{ zyNCN?AhZg{D2qHlpprV-WFUiclzha135E?ArELRdOdH56pvCPN6#z0mcwwMkK@bo?>%s}hggLxj z2yf3l=?T;!4%VdvC*Q=-qHs|PCSN#cDz^9zss7D{PI&z!KTrrumg=@~2xK~yjjUI? zst$Uyup($vmJ&+{tX;YU@vE6WOd($ax^3Nfyg3k*BsiAX6%S zt=-IXqNXeGK^G}NI@$9X_8}gZ0j3MtO*h9yCA15ir(I|vr~_@WAvudLue$G_dnrHR zMlnCf3c;m)7ngOz;8BX2vUfFCj$ozEcvEsfL(-%+RZYp2fHr1gxcxT7F|M>;eBgAQ ze6z{2yuR)t_wh2&-!PT{zw)gzoFlBx7bWi>#ufB=jN$e8+5*fC&%90ZsG|Nj_( z)wzQ{;CSJ!BHRWp2QvZzxGkUuOpx2;4pvTJ?&$AMkzt-t#93)khRz z6{i_Wu0%S{lq<2@zl>|G?YJ7a=KV7MoE8c%nasXg6raR8!g^G7ndD1$rh7NUMLet z*L?oYXL=9Sao$YtoI#UgTJZ^_dqMZ~Hz=#5$jHc;LhbM$*g?Xb4fRaN5e}s(^x9M~ zHIdre*SKMAXejx}TE{#xGAXJ33qsyJPpY4U2Fl=vVxWNmF|sXEfLu9=0D3v_BW6Gr zDG64{VZ9qR5ut`~c&|o++)4O-UNP)Ugf&SZqhKKz26_Y`4E*hb6TPo1qI#`<=8@{@ zYYiXsFfB^T)8Dpjdzc8>t3EwNr+vaqp*|2`hY0i5Z(D}~T;;03C1GfDi3saJO}6(Z zw8wyPc2)m$^s)z)>D%mMS!RSbZK)3uNS)RH`L*U3+CVQce)2G_nM@iDHnCeW49Ps3?lSPjX}KL zu&S-Z=e{vGDhpJeDs%fWuDo`E!_8NN)@1FWHco7nm3HD4wl(TyeA8x&_#=Fe18w*& zEt^v&YOmY=D$`+(bwWg+dP2Xu?#zR(h1vE3VLr&b+?JHUp8{=sm>PF51%U#E9YTb$ z2^H+Vx?_Zb3?GoFP$A?Xg>c9VfG@uH9P!xsZukMWfEHx;f165;|AI=d0l5Itr62?= z;4kl44CFurMIgY60C<8{I#Bj7C+Ja9rvn|d)fTzm&&6aZq4Nz-9l`M#G==l z=L-|-OHzw!rXq4zoTh>dGcy>3xtC2_2wK5G$Hb_G>q0_ew!YPb^eI>cQ*UoO#*Ni% zuP2=)2gm@9+PAt{oH6KlRE4pUG_P@nF1Tit!@bf!Nl~z*bazOV%f-YS7?++N=alEI zD0Fc>2M3Zjr|Un-WLF$3*p(0;F61RfrUW=;K9lg_O2}LJdrZBkFt_t4&p3EL3@DVm z(*r^Pd0FFW6Ao?$i4w&oioR-wR2`ZnqsHXl5++Cm(IcP|b$lxioVNmKMKd?Y{ z>|+Fv839cfW*EG=@gsKGeKkW+z$B5J)?7jj%Cj;l!H3+*l%mssBNBIK|v@B9O1R5V$xvyn*o;q1rzZt#3L=& z)VI?e6Qb^dlE)Zz|iwu?$SHK&TrSYe>tG1-S>y-VLQ0CRf_s%*!4bav3h@)|&n# zE++7^MKjOy&GZKgOod+;HVnn*>#DM%HRVOBcfB44Gl$S}5{keogJU6}-9!102j03M z0E_0e;n^YJo$N4h9v21`N<~2C^$t@$2}<@NAl45XDiC(}^49a=uF$WcQ=gBkx{`k; z+G`1KdCIl$ZXE$0Q-SyZa9=}88c-H?*zpd(LGv1Ib05$~Sg?m#VpS2vOLdLv^$jgV7J2onc z$auYaLZ5qk?P*meGaOZG6rkQ_zS0pBL67!5o5hq!8V|oY=kl~0mle2xc!k)7!nV#X zI*UiQ)|W}%8`4tTLKyH>Txk5XJ7x}2n(#S}{-W0U?Ke!A3!=j!P`ORu<8hCnbc&Y_Hcu%Zyk zq41vg!os#sF2PFtb%0g{IMjF&8u6PSODZf3dVwFZJa^U)>H{={D&Y2jwtye&10j3n zKPbYN8>x$>?-gMQ{Ox>OV7%ynF8F|nf&fbjQXmVY3g2OH7zb25KHY6aiMNJ_fh_}; z99nhIZ2OhHk;xGeofi%i>`|)h%Rx6jm@KrL#?nX*tp~bs&p%ZYb9;v|FXPZq_X1N= zj--j&C%e6=TPX=%OY`b#_4694T&sC&r#!U!y{W^kvPWA8M?!$Qw3gyV-`Er4r;|5a zO0sp$%UX|~nqjfW+=s3Y47aD6tK^jFa%EcI%yJ9v9L@8jzQgp;m`h$OnYnM12Ws9J zcpBK0B%agKDgkyAu$&aNgd`F|00${6M>C2eQ}T5uD9sFgT+ZY|rI!#kb6s@xXs}A| zx^d5{)rO?ZA)?ph=*x#U*Pfsy^sgc$RnNBubem0?h_srzq}Z#GC3Q5lflI?L9=J4+ z_}G;EI)f84^G0lI8|xX1N3mvxM2ty*|5!<@h)=-dC3WknjYn1N^@@r|sEZX>OH8mL zus2Gm$kr}ha7p4D1mp+41Q3tl**w6wh42dpKr|lMn#V>*t=p4J)}NRP?{Uld@%q@4 zrtZwR+pWH_j&&I>$udS@u571(O z4oGE7w>%c|jE$fRE@u|JU0hi`Qk2K^t!Z$x%q3B7-leR_#3VM*!xe28=I281}SL-jVLV)JZJ!V;jaiqAI2wnV^0h^1A$WLg&WQ7RuD*t4BWQ?NeL0=DADMd zWNx`SIi5fnXr?brP)|)+#irO?emw4ebb$CMv^ZQwxUp$z{g>M%1~R9DVop?o%Z4d3WtKew%668C11|6ytfOGZ#1sj6)i!cx&-~k0; zI0aJ$;5XZlf|F5@x%!?1!7K}Ey=VGPxqIxGalnvi~pmh zQpB9<)QPQ+DKyGqrc3AF=3mLHN^Ksy0C%DxPqFa%!A?Eq93 z_~euy9N&fU%Ah7;uqwmbQ{bdN0XnJA*E1^|xzc-x$+vxDC5rvta`gAtLb8n2=hESyrDqH>ZW zV5F(*awE3#i^Kh$Q(V2n)hp*s5|%b;;@$AY=HasY8Jt-YFMsptkS%JiDXE6l_lGD zsI9s9C@`=+BNwV6MyrsTHP~16V0LMtul~ZqFyDxae}3TefD8S3k3?;wH{QtG}kwH~@Z!07Vb1jFMMQ<_s%C87DQ;A_sFRH$a z!`@Gkj^b>{^d9)#@|h3x0b09rtkK{e8BdD-P;%UY zcNnvWw>A0C+I%Q5J4Lsz(kvbVj*h~!dHhAZJqOVP9QaAufS7>4AGlI@B^lrWNCNCq zIe6nj#r)a4b5!`P11C_I8{f=QdupTX&$H^=kws2p4yb?3+&)zO#96q>g*q7g81J=( zusk-{Sn6l4GV5FHgFiUZK1p{VuG8a6lLPi2+CO2{uIH0ef}3w;U^ekzEF|VxyrL;t z(}2O;YU+A#Pw01T{$ftm)VzQVywVne`TbLe_0|F;^R}2=ExzhWEgjvV<=w(Y&UeKe zGJ7o_oS#IsMZGCRZm8p%4(%^;amiHg0^XJ~(~XYIN{0NW(_$sb8P)iq=%Tb1ZXjP)+!Y& z)k62L+f2>QecKhpzDAK{5)4J6raFs#T_+webW~6AkIf`t*p1(T+KPuAzOZbyF%*n0q!h zz+v8#A*p@Jub1|f$Yb|QEp&3N4?QT?3v~~5gkjAv`OJd(1;iEp5Vns&;8I9YhE;N7 z9s_|dIBp*{fClfiD`64dT}aT{6qM_Lir*>ga_WP*f8;hw|CI#H27N$+4}L(-7Ae46 z_`|^c3?P-E038A&_5xX#v3<4UBm$f@o`g6L_zwcVhK1X?;jxP=vts@})ke6irI5#h zAc#q+OPu{B5A~#}GQrf#A}ij=Y74<$48)~AoZ?gjBh-}Ck9Wu){831C!laQnkd;!v z>iwI`f~NKD?-D1Q*xv=n>w49Q%wxF=>JNR=>~zbH6xo)MPE>* zm6=+Krmo?J8!HX2$_v%M%+NnMds9u!BXnRFZm!d=bUV=K5?4NXX%N2@5EBzG z&cr|6{CVMN$~}1>@jS}~t7YB!y1{`&iEC>yn8&`t$Bbt^yN|jyAH78`m*bGLJ3m`H z?C*N{`PcbfvuP3&?Q|ne%ORJI(_d(wp+|cv`s6BGmWlT|*SB-)mcuDNUQZ_QdhGTg zi>QHCEujd7^_6J1q~<{L>Wcenwa2nK00Xb*rKbR;`b&XA?;1EjRhPokcm>niv67gHQf z8ji}GHX0he9kjnHy0OfbZmNgtCk@tV8FRu5ZoiB*FCTem=4XHFxN;AZ#G0O;rKGA# z1^CwKPcZFpV)PesXJeg@FU&bDqF;?}TrV2ePRa}YWDD^;3%M`Aqktt`x8{&8wm-$L zCP+GW6?x8eC1(pkE+piO#JyYYu4^nAElKc9BHC!bt!R0bym;YB1m*suSyyd?-KhjY zHb%*vrDWGlRd*!Wqb^ILmzrmsR7MxroHEbyVJ%CihiT(+_RWnYh7GsKPQ?1wnUJKc z%hl~-Dy5N-KT~U+^U7-%49zq57!}iIybQ7^?T~6 zw!P&M!}prKO*|vX<+c;)~T6>U}$ut}!oGJKk9r z%{yie5UlxG_)oeR&({I-7NBPV!wy)LFbjozjC}Ax9aITBFJOC9V8_|9+f)ZsyyuJ1 zZ43AixWO#*zvslz+je4@iu@ZM0_qOBafd}f0KjgF9lsas?=l9k?VJSzYZrRwD(?Zn zwoub7_Yd^fuybok3)?vK{60#!)fH3QFdZ6+8);orIhK?z?1*zD6G|wxui6DY(})$y z6NBxqvJz}3kDg+qjTI#RIqmaS4RHgEtb_3Odg5~8OPN|lPD)jJx>FS{tzkxeQ!CV! zJcMBxX_}bMImPCL|16r^mO?n{{NjMkKd9%OuFZQ!40l?&5F4nG?(h7*${J}hG3YHS zLp{Hpx;*OGMMHN;M?WyZBbm@i#P`H^u?NjM3RkbO7<2PX?vd+>Wsm12!u(#<%-sEw zI3xGyQ9v+ojyT{jA%>fW?j2)0Ow8xAVm#HzzOGr%#HSCMG|d&uF5Hc6UNb+^4;#{4 z$Fu^P^gY9zcT>`jO9%Da1_R`cCEseDzkc&+_lxF=l1hEknGoBzS#F*l0aA;a^OD5C z*6Sm7Bkj>o*^XsKSq>PVx*wbI!d>8MPZA}0I4P;~vtJr#+;Wd*oz<(n$Sx0IxOe9? zCf+3^HqC}|^1PmI7LMv2l>AqyLx7@BphMtVrpfU}#oroAW2J2g_7xiN8GLekx9 z$a-qGrL7H_vs${i|E#}C`Po>%P4k79bL<~yOw49A86uTtjjAK5F7qb14O-1ZYI1{{ zmVIHQnKjYMa=6m{W~0{_MXhT^&2+fW{8bidND(QKvrsoSa`T;jq?7+O{E?|pf|C|= zC3A7J06ptFGUJST*Y&)qeG|PBm9!Q)s1Q5CB?qxPndin@CF8x6%vq zeSJpKy%c(S@_JgDjr5R8c6BXr{ZY=K$!14rR6)au3XG-SwbI#%+J^JBua?&uheu=W z?F({ngjdxsW362`ozAqc*fCAZ7SDf~hLTLEU%SF$NVBpz)U1OES-2RH!6EEYa^mU~ z7WHzoZTU-^Y^s5RK_;el?P6}CZ`qJlnU->6#f1_ri`=7jLVJ4e+p}9S-j)RXmHx|} zLNB^CL=`&e1dR*RhV{j|t|=R961E%BNo-1SKqP4hS>#B(yr89^cV9hAMy~2ub3uA; z@#wOC4s#|GJv$L9T4>l6ZOjl{_g;P(d(FMkOCkL3RS#ETzU{A4Al3ziZ55Q4fnwn6 zhZ(9M?~WAjtC1b<3p)jkckU*`IxDQ3Zr_*sg=Y&t{?qwBdFLa77|0c~^Fh%Kr=6pR z8_>uQy9N9odIA{%F;}1|>wpJ>&lE(!4Y+&TDF|3JIQc&e8oxgy)Ull#W)5?L9tm37_2gjep2l zzF~qjR%WC+e!%(owN<6b!hr5qTL@QUg@z+36cQCU>XGA-Z6kgTFP2f3lBsrnmvj0j zqAui8k~YPN0Vv;6)q8AC()~vkX9;*ArN*PtvTW}_#qVSKd{aYjSW)OAM)S;O?n~=h zdlggHx+=Gkb*D(Lr|pxz!vZ>jI^Md+jVs^eKiPAOiIyU8VDs;4~^VHS4ta-{Q z?iK>4QKvA+npz9^F8Xet-a)*v+X5>l(5(gCb8Ev=(G-g@Kne-9elhY;RnqkeZIAsy z?cn5+1gF#oT$Kgj4Lz2AI_DNr`5T;CQlM{h)D}WSaVkJjwX8Gf(yXhuZuEYxF|Fj#QH8In zG;Nq$h(MpZMBsXG+lcm8aViOjpmuu{IVMK1f{x$cpW<$U_4-a(U*0jM#FDVFP+5|? zROD&`x$}*2;O<9TaFcE|aHJ70Cw^i~G)g4cC|1lQ*IDxSDCcQ-_j!iAI5pLbEImD+ z%~|r%{5sD%Vq{%8z>#RBuKI;L=cxT=Dux|nI!TX|tYA(rD-|Noja-XvTlCCMcQ>u( zlC?hDa4>i?yLi!Ea&$H5k-tZ;LNjtk!LiK8u9r}0q+5qJ9uLQI&5D1rWEDzBwi}H3 zPjm6 zW}th$EQi1*&fT7}BD2b=R=M$LL1ip*G~DP4+0BxkY!y6_Qsyy5Qp+JQiSr)ATZoZi zlkbdHOQLUg|Z!#okJ@23bN& zaO<=u7ORrqjK!Fs6-ymj4>#1&%nITSZ*oIt&$o0rdr3xxriT^<%oOD9ze1Z+jrBnu z&2q6QK{nf`uP&7QEh!>7xm}R+P^&AKThmauz};jVQKJq{tXq$1F!W2B-nieid365l zO`N*C4Tr=IqFcBn+8LB6y1U|>N6LJu0lA6V(kJeV`xO&(jderj#}k#BbX}9%cN3M` z#)lp3-kGPCsXEe(GTkwYmr|>ZvJF$;WBfCi_^VA9keEOsP?JH*<+0y{250v}I%Ps!tgBP#5}S z_rvh}9B3ew0jj~>1)gI8`0BS?MBRZeA@GBH)Ur_B9r!pLZvDai1Ms!MS>uF{e0Iu{ z5<6dEo`Np=IfKjWXHV|9F@R%~=PS)XfRF*oL6FUWV&K;2UH*nXw+-VD15H85=0VAG zcr1qOb!=PpE5i=9ktPg`F`k^x;?!T~2)}9ymMjIF5OEnP!(&6;Cz1n%PCY+yVOdMK zs~9zro4RaoJtMbRHe_qB+vM%p??`+r@r#|0_1T(rX{Oz}`V^j|g++UCjWmAf{l0yr z#1lCKyl(#F$c>(wd3?FNUgHB3s{l$&&W&e%=y4m)Ap6O za;}Tm&VVynS`~(BxviYQuTs>}!O9 zl4WN?eb>vkGsR9(vh=0f!79``>4NT-KD&Q5yrYxY(Y|>xQq$4+^niRLt@15|!sU1& zb8>EL4AIHsLb+5*))Y|rL@Up$9yB|BzY*yy#Zr|e>ehi{|GIdBgw62s68N2}V72z- z03YA!7W*_sJv~O1n}2pCdyE(udv3(h+DO^nR-cPytUS;!57zqU^!1Up7Lrr3jb@0P z+%P41x$eh-$svyC^ouP716*3vjK|J?PjtVKlGCm--8o!lUr?jF9N2wmuadeCCiF=$ zMh`2v?6i4n@k&+lcgIE0K;iFtb zI)PG0Q#c+R8h$r1TwbG$vzpN8(@}<{KWJ8FYDgz@A_Jy(E4$%^vU+l-O~i9ev&o#Zesd11nG261W`n=1#e|3v z-*v5TA@*-p^rnpHOD#$3hGyN4$6>8{*>(eBQg2Iss_~vjclcsLPunaiK}`Ro{jxH>nShQ)eafFrnTpk(4D74PV{fNMb`WapDF}b;iY-CWut- zq-wR6s%$b9^3saa!VQ}XOUuj2XSNVOV@B7mB$cAlC$L(k^IHgfWKL68vEF$hMKc4d z$fN}mrs*b;wJ6!|RANMG&W?G;%_{%=TwUi#PnG6^C7~#@fSj}8t3POSDqe2m;Sx6vr3*Nxw|~z3|TyuY@ZeRo#g7#9C86# zkYT!bS=*}wub;Z>h@uMvy&jwX^rupzzx_0myRXMAQB@A8pY7>bA=8P@@$iW1U+P;5 z;$rOS@#7K0v1Ng|+6T=kgVt}{t(q&Dn}6SE8@pFY_qHI(mY|hPP6#u_K5yykzHO20 zgwlKyB+>AC=2m?bR;VF2UWv)5UvF1nE(W0_UeBF#S!0=$rav7CA3kwH-h7}lNHwNy z*8$!atuR-Iqp;tSAO$Wm!`G2Pl6R*3{yW0$t5he!8CwSQ3iR0^@6IFm9`=Lljt@S5 z#vGRooiYE;u-QIi2F`Ox^gx3G77^3yGJr&C^w_*-)I(^XCV86V*QAhQu80nwHfe4oR=S1A zI-NGHF$I2aj1dNd^a(EbiRKyo1noOcE|(!ew>|R{vdrtL^0l36f-CNp!@2W|b(Z%k zMQcQwo7AVScM%Pe*NWLjU)HRzTf3wR54KjA`Tfv?0_s@nR^;Uh)zZPau26P-vww*@Z~ukIC$k$z@8v$ry21_> z0wUdbK%t68j1Q;Hzhu^~DCGLxbC2%My%{}UzA~acTnT6nl%b?wPr1%;eTG zS_d^x|Eg(NApVjZWS!HAS6mnBYWsEZ3`;4SoYR>Qt%#ayZ$&-w(tapLjPakFAJ&-H zb!&X6=Yw#c}) zX4G0s3C`J|mYfuoOL4fVw7~Mr+2qh_&ZOKTls3>cb7JT!3~I3PZe#aD332gW3BFWE zN=V8#riGFC#@6^`hA&FsY1)&{X=1>jlW=F*(h=E5_tQ@xSArLfNRr6oYR^&%U5tQ~ z#eq{V?xI>wrkG(}+M{Td%yfGP`}So9`O@1=!(6GS^lbJ~N@S-&N@!!|+ydj7g?Ot( zHgI&MeYvEsvPT(*T6NoK&={Eua-%0BMV!>IJ+Z_h+Vc6$I0h=k-I~z77-~^RDk~v~ z4E1bY5o~B@YaQ-;6pTYPD45)}4{&W?V=?g7g!(M|n!G^he!FX{M3kM~#C&jUtOViv z?=|UWwzo1W9^{_3R%C6(86y;#{BIG+5i0I*N^hl9evy>U6HIBe&Z#7V$JVY_4RHaCSt1AKG#|Jl&s zSq-3D=-Xvr=0F#Q;9E@K!G9+MV(=N@?Gt;k9jr(3vA}tZcVd&p$^Fo5VNti(L=~0Ix)lE%p zB}naLk~s45J1i0zZfhUlFwv)cpjdY1C5Dn#5?q2DOHrW<`x*VjR+LZ{q^;&8wXdl; z=)4~GU5P1Ztl$VC$Z0}E4KA6j{FE$P6e|ppC zj=B}&9eoQicjaEtr_7}-L~4k(?3BT!QQPeF$jEipaON+KrmTic^$p}`QpB+AjLn6& zy~S@8OlT~jo?8LN!<<&1hBHx)Zyjy~^xs@IRQT5u7Ok$3(mt9J5Ndb%R{{zhB4jMo zK#TOE`fBGeX6~eDZzekB#3o0_Np^!@U45Bl{s#CKB1tw;!I~-kHy8E)r96>b_SnH# zaE$hZWyZde6ZiPtkn38ICANv{uOYMOoimeo&@qzo7AsL%>X2No|E~bNS8**#Yth(L ze?eI{W>0r=XLv$<%oJ%vj`-Tf*!^1Fx@zHE4gu}mED}=KG(^jHq)FL78W-;=??>ep z>e(xM2WkWi(lJ8O`NkdHx73W^JPB%~!Ho?uYmmL-o z-N0Aqwl=CR7L|sLrP*Z?l$=QWzN2Mzap8nSLDhT{(>k%vJOoTR!c7#ErS+UrK&6 z?`5^F5zNv@j!7+PdSM3J+FLaj>qa=*ozh9|p+X5lOqJZI%!RaAIT;CHgYFr+R!p10 z3K<|*jZ{bb>YraoDP)Q-auyAg&^c?zqLWy!Pgl4z_c-&&!&T zW04#nCf{Okv_w2A(Eb&;W3)&BEK#J>`$l^i`W2ae`_xU36CxotFXb!5S7)6M+93Pa z8NCY*n$p%DOWb1o(K9q`d70T*+7ql~BW@$VEGnBUrD9x9lFEto2kQ04aSPX@N)wSx zw`Qybu_^{{%shd_tPMQQHDxt+dP=4E52pkhZz1TRICk9``+-J#itb$L+(1gs5L=>Z zD2sc}z{}Gqf|M6IO!1w!%wlaJD*ujYs;-_KNsAYsXBV?KK9f2di!o7Va%lScHMqxD zN%pbWV}(lzEDh&Mt9jSWjjQoT6x}u+uf+#S+oh(u+8j{)wS?7NUm0gmZkIYSv9MW* zBERTNC%EipX>yZ;2{4v)7%V8C-n3g-EHYv>7@fxSC(7UZbl0b^;qRJ>Q*f z){;F+cr`fO6&v`_rEcv^%E)3Gv2|YkCOzH6cM%xsJ`;r3DmvQJPREkw>*;ZBa+}xE zin*8X_-KwGHpRCaxOz_gr;QQHFanf zt=0AFs;wr6K9nA^dG^Yn9z7M*Rq=?p#IlhlzCMw%X!WU=DK6PoIz4IaAKzm8_9PoN zCmWkGl+eQ9bEtn9Ny;SJNn&19Zy`>JvV_K?{DJ4#F+uxqf3ueXT@5F{}M}8q=Cx|2}>5r9)hh)iMEo+_`U-Twzpo?(8i;tT;t0{jXrhR zpoZhEQ+=4YrOj!?viUXZ!wz;<#lBM~RHkYhaw5{*8FuPKeucTrgk-l<%%aGSfk$Qd z+Szi#IaTF?PgM0ztFAjt`eSP})Abm-Ya30f8t0bYE^U7c1M^}Kg+V+#Y$pe+>L+=E zh6D=t?no8T1hyQ)09W5>4NDp5XEMIt{+Wyl@EbD!bN>}AzF?g{0|o;UBs<@J03Q`_ zU_pK=Ap3aLz=5^zBoHjXT8My4PQq_NG6!Y+x`G)F9OFg{AyymuU(Xv#f=^pet#UY* z-8yiqQ4S)A<=ZV-N`JtVC`$@I(0uveTgH=yV#A&o+Q}2&{aRqfJm1n#>@vBGrExDh zyl|D1O9^t4wp+bL2`!4jHMIiYITKUOl|HVtVsO_gG+fUhBx0~Vxq}l*q`s5=AY=SK<3PqCwTweb<1(Fc5C(?i8GciR8?ENusyJZE z!jYUxTDe~{?xPh&aJCN2(&U&bdOlv=+l7Yp@}>Cqr{l4V$qQ@1W*+Z!=T}+qoYFPv zm6>6dEiRv-6e>BrViU4Q3_k%OqHLWTj?K)v4;2+56TQ zD+*x({4G_yL%!FHp*tq$I%wARV(L)ZY-@S7y8Zx%bM#8;E6QMJOx5IYC$IvZE!WAN zjU?Mg<$~tG`y8?Uqis@B1cg{xyoCr|?kV)lPxWQjFEW=i=OahL&Ayh)y}`7fIxnOp zh;iMV;imeF%-KFFcTD08c1Ct`8;8|!vYiGOSB2Ng=v_W~=auKCziAfHSCv0sW7X|F z`H50Lo>G?FR8>#xiy)&)*|k$7hv~taIEkD}#SN8<`PZ0kEYx+pW*KJ?pF}~0IGp1= z?69=$bEcUHR&b1COtUy^q@F$i9^T`ycY%&@&^%oO1qPXKJeHL9iM^-e5?yT@X>{CeHHp% zcW0EV;Ar+L^nD0)kPDJf{QhU*c!j*8knipmaGrM9pFiq38pWX*AThd4)e|8hdpGt~ zeX2x}Rn)MnN{AE!iYzTCNZ86M zgthJU$|B@PDMHvnK@&(Y6pUX4|y4F6`wOvQFx`u#NpKEoMS>^o%b#D?X~Xxlzy68KkD4T{r80 zP$T7A#YjcpXns?|4?`o*gxa1RhjwRpwCnDDP<(y&X9Y=kgB`>9exfwmJMZDYWqEbh zcNWxfNz@8OcS9W&LH<^kf7omLaG2KSgozn%x6nU_kBTbuqVHA^O?&5!Cqw&oxpy0N zg&r)lm)jT2>M9(H4;fu5u8MfS;-KsJ52;SNO4}|`{-!UK3;vey%~o%l%bZ%5tG);I zLiH~QvrFPEU&=HW(#8c_j&uhVv`vi!O?X}_DeW~sTzbejGq60tZiwb+v+1#acT=gW zK~FUfChuVDjY)qW7##S}KH@L@0;XqKKoM-Ko^O@2Yp)|Yf~_*5PBUrQ>?7f%CGNY2i1XY0-^0yRdgq_&H8D?R+{IDWqi^?F^h?git=cO>hoXeoT7W(V6v*!b6BF5#-ZCU<|Dd_ zCw4U$*FLG`+4oyUheh(gCT-U~(Qb$H=fT>$O`x>t2R}Gc{P@BBe*Qw+whU7jLjRR& zIr)jwJ)?002_e%By{FlPt;K3#AK2FM+x9Uj93|)4!OY!{?6-+rZgSvM9@q4x%+d7= z@)nwE^;L`$#~IIwrpbz)ar7{~R-;Mz$@)sse80P9nPUKR-ZC>Y%&6J( zc$avCtBb==W|>1tFJ*3TbS2G~Y@-egh z=k|j6$<0nojW%OhmDo`sH+Jy|0 z=E4rys9rt7lfi{9+6z0*BhRM%-Wk$3tz*(wkSM2HKEB&|tkgU@RIN3{GyWNg?!zWxJdUkO_`ED0R3R$p4T|m^)K0|&(xr3!L=1-#G6H*9c zx5JF|8Y~}@?k~U<-+g(e->UV_oV_(6@aJ5)07U`{;pO<4R~XH|6z0W$1?6^1WUyY=e{VN-aU{10C5EV2^p7PCwBXv8%A;YhlcbDSANAKdb9dGy1!&v&#!d;e6Ze(s8@`lTn^B_UvFMP$@LAtt$>2yz zol;iTe5k0N>FRfaIP2ZUvz>n;P=4XhKYLm;jC{tn)#M!6bY1XE89lhMp{HeX=_%;=}op)<8AGN0cD)@KUVdo|6H-4cfbPoSs@nzf&pV1w^)* zw6r_6lSP5D6&^k8V)O9)Ig=rJLuQ<9%V-{rOC(x#Fe3v;s1dH6>@l8V6Wxz&ud zdl59lyYPP4(Q;LtMP8#D$_*2WCefM5J7-@bt?IhAuM43$Bo!`dicgm zna{GX9GjUNUg}NbiV|#{*wePWZt7!e(=i5rZfr3_MZaCHuVQ-$PJTiy^0>M;EGhqD z&QEbw_fQ{YCT6GEkz(7lI01$(K618=3yh`itXO(h&1dvN3YVy(%)P=3sQao>Qzy(? z(bu)zG|M7#?_+kA|5KYN4WCS*8Yd~1hI64=49-=|=)W~Zz%_evlp^I8|NJ}=uZtVi zDv?uok!Ku4u$ZCTh&H2k&zQh|;G=dOSr8^-3q4{nezdEO?d!^KuCN{Bc=$afFe7_X z>)E7)bgBxuIs))tqxlqJI)_o8nfj&kIWH03j+K30n>f`nx9EJuetV0PRlR|Hd6ZNrgiyj(}W4=9giFnuIiq(J5+v+x$*Co7^5l9tZ!!r^G#aF zr{>etCkE3Dv`fyWx^ygF=;RKSkqz~u7PY4=Eq&sIazkfb_PnWhAn6c3L)#+H-LQ{| zclrAM2mFgqzL*@MmJ(&rrVL{uCtcko%i&QED=tvMWAX3vcL`74Jl#=DFB2L(wYgF4 zn=vFJDjrK)*vj|gX=duW*AA4~-f1gI@zCsYED1^Yo@L*W^;U+HapPa07;U9d@GY-7TVjeJ!9(+zQA@}6dO=3Pc^(tG~Lc z09a=B`ZZ{bkIA2m#7|}RXczbfDW(Qq#qx7O{*G)&&7Ai?;ra=uxXknlvlS+heSV&Ctnk3{dbx$@r?k<>w>ZSk z!E0p)wYZ92OpTm)V_n#%8Fi`kliONdv3+NSZ+2sWcYPB(x!RlOE#sVNYeL2yKM5Q#IiOOPlA(f#k`?c-nr48^sqs$1;KI4{fE2? zCmkzde3*TaPmX1@l1WDN4F6q+!jgh78+vO=j}hS~B2>9-4W27@HFtU`V{o^%nl_Q- zQ%fTZjC7{+OBbBON+#S%WyADZyeZ8x$}6gIyD~n6J$wG7|Gq~CZO*O9Av6~kwn|vK zPKr*5AkafIwgcB0sXQcVAG{}Fnm_SnrJr@T`fynY+Vv^;b_?G4{|isnr{ zLg2#u5IcudKyy6Ia5I@!n)BB;eUyXGN>BX0YlgsdNP9%TO4I-1s{aFb)_pWQfKg^-fu0t zC~xWvJQ04;#W@qsNF{|a*xTeXi-v4l2Hg0Wt~r_IVa(W>>$m?}qj|UHFg_FRcb--s zZ{Xofs7oy!f9d3zC?9sbTPO(DEN+uic$7|$Wzp4N%FKA_DTkl#zbipX%b4gjKb#y# zW)sL40qclZNEik(Ls$=8o!*2U9X}!wZvs*y(5>mVsly9pDe;6ve=%0SPu0iy;BvD<+(`F3{((C+$ml zK3*ty`BHLes$ARdnSrY97Y{gJ^qm@;KX7%diDFy(X?z~jmFd2nnpmPe>(pq(NR4o= z_1Y@1_j9Co%TEbxN8#Y2?6H!-`X5ha)f5iI`%Kma-;8fKn@kJI%JzNQX&K0;SS~h` z@AXe*Xb@ZPX=OSX*Iq8&COGMo}$7(3I?$OF-s7w?+k zmZ7G8;*%l$>3kNg;3&UjU~H}&4(=EZGb63veTQIQ#(={$mOVE(t-h^Fx+X7WZ1)E( zYCaLpPBR>xZ>G;*8J#cB7bra$HSvGuH@t7?reJ4m#kOgGvMVLhndAL-tBuKHr~E&? z5i;PMSW}Fviq!vfaQa1S6Ni?1AVew9(x!i(tLfX(y9jIt18-qNDK1kFr!bfZ%;mGn z3Q9F^pDOk8o+B}VRckrbQdwr%S)!A-+d@liYB4(_GMK=a7;BG; zx7TPR@&NlCu1!g{($*J>mK1|pZJzo+_>%u^94~vaS1`4Nt}89Vuq48T-Xdv z+p9U$#1$Vo{vrC~8JcbAc(yseB9&Z732FXFRD`#_@VHgBoaqVj`mEX;h{uDoHf~pQ zO9^39tePm}19uBDGu(;tOPZI6vU4h@MknnpOwAh)Ud$Jms4FlR?6jD7muy<+y#pU~ zB~sM5CSRcY(ERma%( zKHMhS?vay`KTArA^CwjbPCO7yM?Y~$=lDi*b@6a)R{~E_l{9>jvuE&#=kr651m?xLA^I}67nX7ee#87d!N8K?_9p$<)Zy$SD zw{ZBhHf&^_A#_y;lt$Yco_Gs_(wk(i#Ypi2CJs|3MzVmGLgU2_Rdf(x1I7S=Gh{I_ z7!*lchl6JThP@&%J777Ewsur88C^-3#sPH5?DJnp@Ls*>uOPp^=x2kp2xMTPFWDOs zFaC2Sr`X^-AS43W(z6QK<`qPaMZa7Wj2W>Y35iE^z$eko?x#`;v7_-?o}sRDYpT6U zx8T|5x7IHV7u?L#Ph^8;=lmht&litu~eHMVx)Y*fgcC(Pp3 zt~Wp;BE5{rYWtSaHvK{{r=F7;^&)t(EF$p}wXgL2xVBa|IV#u9!!KUEIAoy5(#2mY zb1crOP7M<5e0pcje~66RuWz3m#i^y9&Z#aV8@G*nzDvJY;K29StUaAW-kEp6i)O1o zIQ>WvyyK?|oI=68Ba45djAX1kLi4}q$v;D4rLi)p_Keh!$8#P6<-y>ob8nS76@PwL z-Ph^qby#;@Brp}%&3~3kl;`Uc52~qq^9m{Sy5TUv@M*QE1|X&iY4-HumV0~b(~`YD zZKTE*M~;Xro*jQFQ(nfhJywRV4yxC)R#a1OduyChm=4>~m;aoWKi14iEf6emBQnDy z6@~^V_d=RSDn{}*W_jr@88}(HQ$l*Ei(5aKKGo1z;ojw)*R5k2WzjT3>X1vg__&)= zFE6?9aNkZ{abtaYBF)3xX8yo|mc_EsxA(u4aabVQMwjP=EwvJJ8cqh{o!>vk@a?Z4b^2&Rd3GF(2)>)|uD6MBF@!Pu`Xj9(wmsPZixEMbXWpD0Xl#6;C$UCMfmm zs0$3|WI6m}_9}~UBFKhFJj!~MSTcVt^q@|aXC9S0e=xO;H_mh+i#8K4bh9aq?yh5| zZ;zRF*6!YJm2L7-;YrWQ%R87+Jv>{UQPk)B(vZx1r>Y4L;i{&ofpazf=v3dZL7&gj z)G=1C`J}CjvNa1`*1E3cQm*~pBJr`S8{7l05W8z;H) zjC^kp=1D7h&~>9RZ+f4Bv%ZTbDKe^Zp|d&SnqGR?H2c&G;_%V$1B&eX4cvfOx3IdE zZ+$Iat=FK3RJi28{p*;ej0CQRfyZ96q<8n_Px_B+^1ncK2!$^Ef8Bu2aJNN5KpOjlS8n{e#t{E26Lces%zng8L3!DgfCDz_@TAA-&+f8^!mhYf@RT+K zn}66#@j|H|-`6p(74GjacjTo5y)gMnOK)rQv+qPltD=NQWe;lirg!Lv*A7vm?I|1d z58Lf!&z8TZm61L*SI#S*GcGsK&pIsM(U`ZRf?)m$V^Vjh@$0WC^gi4_4dyCr>(DZ)7jdJxT~V)IoLitZWa?Y7zt%bdYkq!*vHK z18MKnUU`;pn&#XYR71WxW~}06!-pj;tZ9>CKkbjyx+`Wn5bzLu=srxv(FRr&+e3vc z;gh(8=XSiH>nHuET)b&-YU3U7ARRGOBp?+xhi9C=WF6HS!amfgMfXgfIjmttQ)m}$ zbB_0&@Z&2*@aM}vCp$FV-b2JERBmAk!{6oP)A)pEyutP_NxId+U5&+ zAMT6r)LJ_=ZtSkzXz;GjaV^nt&d7prbk7ETyg`;$C3TC*ovJ<$wO*sTIgPFt&yL$a zUohQLZQ6G~HnDWUcJ8C>8$ngi%ezMmCU&)x#&n#j`cB&N=*rRWi+FDay1l7c$a+KM z^1z9@pfZ+rA-MFJ_wWa)eZ7=w+d$wniGKEIQUB5C-r1r=VLuv2EKHv#%G2M6>G-L&$!LHy@-6OZQ0V& za;t;(_lLgY-G8|a186PGyt#!N1onWx&(_dPu`RuGsqVD@o z)fJM$1$Cnt(`2sqo|iIzZtb@D_GWgrif6^sfM__)(;vc$9~0==TaLvSW~aQw}*!#48mZCki3{i%@22A2e}bphWnoF~@4RzmPOs&y(5XqmHj!XKKtB0IFVSMlk@jNu zfgXB7@{Ipjdz)I+ zEQiCPB%C2Ux>1YQRUU-9?9Vrh52jBhtw`bwPk zsZY@6Np8;P&Ux7v4sy(ib3aeoKWrB~tN151s_{Ag;3*o>n)lv&)Q8IXDejqa0Y1PL z!#gHd9_B*Xn(3JBM;LJj@K@IWE@57PQuS8x;BJ-rR(eY;{3!eUQb?FU%PU8 z@Yy$d3l1?74n!K3IngsW+f)Fv->M?%UX2E~AfU)~td!EGyFe7prP~B>Dij8)=&{)) zRz0WEZiaby=_<*>6=b=~Zh3Z0dKH~XcQ4E?)gAiypD~~n#7xpJfAPSHA&3tEW{r#) z;>0cs#9Rk3;0gdx%(Orp0-PE0%lLUZTOci=orq8IOTqQ4FSh%xzSw>o$<%dRe*%)g zIJ@GL5g@q)0Kk?2UI>B%YXTWexUNKw$SY+K#}`LhZHMGrH$VUI`aFrD?5>e)a@KZD zA$|7aZ2BlYf#yjv<#Tu{X@%$C?-(SvesWC{7O;OU@e%l`t5w3?hdlM}J;X%UEJrW9 z-3`q?eEI7W3y!SHFnN~}TaY&+l+!62(lOGnwrXl=pjS=_d_xF>BT0e%2^9YQn(~r@ z`y~$#{pGR1)}f)IdA_9LDPifl{d?DT@7s66I$2?a_K-8gG6h&UP* z_n^l6S+pYPnPfjpH&Jl@`C3`xq1{!56;`dKwv*K=OMc0t=c_-zd+YD54b^Z$ka%Ha zw&VM@Ee7{9!sHGb@8xkH=0ryKJCyoOP|rt|6tx#QmO0(j6EeFjBjMOuYapk4mP9B| zvf>t=6f(Oda+ zxDt@U0n9+LrFt#b%ODX%m`r0-Y;hLFvHlbLh@=2e7AV4U*->#Y13Xo+1KXRzoEY)~ zD0CGw3;+#YOl(tXZ2o{RCqJCRkiwT7bX~7@>N?~ zGsrYDShFL?zh4WIH_;nXQNkzz%$SKEYt}4FCx#D5fhY{Q5$6|LMVt<#0u^!y69M&a zooo9|mNF^|k~boLfW5|SRiWf1*Qf{;Cnzleox8fhiUVIOF0S zK{ITAkTyIN5CE7tvOE^B3WnFj8dqW5i?d(``2`_aNCXxj0Lgyk?`~B7e&dTfw1iDA z?fY0(!77og|LvrWeGruda)f1G+}HpR z8}Zfxa@)SrH=w%AR*(Q21^1%!^nm71Y*cvB97<3>jKa)Ac+lX0ChAo^hxWLz6f5K^|H`_5+l}xD)qs0 zy&3#~9$OD>i~Ya{Jw)1=D>2bDaRjjG5p(nz=oJ#BFA(#{$Cy%|BkRl{I#y38A4rSp z%62}=9F|3BeaRV95Kn|E2Mof4ho;Mw0+Qgd$zMtc?Rs5T=5KJ?br)V?k-;(_U(F~G^DQM;A5p51 zJ@`;AunUoI+5BcLEXP=JsD86jD_8|!)r-P01)a+gB_)2HaT0?ftdv|*KQgK^xiON2 zu+x?560JppzoII2b@R8c-e?hv0#^K(W$(XoU@?JpgFR8#0HeAA^o&E{rMH$~(+M$%4`4ccYhb%c zv*9&C`HA{dVl{}rC0u8@#S0{}j>0sbXhM{DC%)nW_8y)y>D%ccN&26TIDR6va^ z!+*_z(c;CwB5VB-QF*go4vnOq2rL14^=qqQrIpZvN;lYenm>x<3F z7@osYL#S$5$^AM6LMRYn9N8mlVDTYFWmo_P|935z>8t@+OIQJb6@jJ#1P2rTswqK? z4$-6tM;gq;-!d~3e?o#okq-z3Dd_}mFo^bp#UGmgVg5__O(D_0828I+643S{W^$2@ zw9jH@EwUvWiMdesnt--;$jE?mwNYK|`Gp%gMeYhPPwLzV{RxdM%^fkS&}}xNC+dX- zs(AtL}UQ=KHVY5yCVkZVIfyr5?$wB&OAYMnRJ> zM(S+(*j!%PbXY@*v-66*ZjHIP_eh}NU$d+?2UNu3UWtu91u2>VU9$%D!A$^=s5!(a z0u&k3LjYZJMTV}VE3P7et=rZ9*M-}S{GOBq}A?4DK zit_>zRY2+Za{6L4A@iyrm;W3I{EztCQbja~_FP%xK(k=M7-VI=4lo#(&;-9E>#^uy zA)?q!>OoJ*qDKlsFMkY_vKatuiI5n?UI)#O6qABMV3ZZiptd$cDS%i{F$8QJK)|ed zbshW*`sb2VSNPmnP?ox)whweXp)JDrq8Kb0u*40Yi@d9L{9w>Y3`~2gHUgzkbR`0A z*`kmb)RJ`IQ|VYHWvk=W?Z{AhKV_(A7A;HssdKWWd z*T&cONELotE%2{tLpyfF&Q_WrjB*SqOE4~W)Jz;^wh{#)0a)VzBVZLw?0mJk0VYWZ zT;k3k9hfDL;95lofIJOER*1g|WR8T~S_>mz z@?kOU1FylL$NGgTijEnyi!RRhD*O+^1vk8=Z}tu8VeJx34a?1>IgB7dvuFn&UOHwHIE1_Hvm1O+YhE;vwgMUrSOlrjaHW&?%r+NrTIX z+dx7QNaL}8e;fcc5nSr$)T<9rlCPDDv1_O#1 z!9q-R93T^Uagzhb!*=vqMFmX!uebf3J2gU!mog_^I#LS5uFV`j{`ZapK1PdMG?)J8 z#@(8$Ge-~PV(I>WW%crndV$ZQ{OxCnRgp>oZ(p*x6=u5l9jL~zyO^SL&}~d}Dc5AG z>qQ->i5>kjJ8EX11^3cvtA<*~?(_`$)zEZShO__ulI)a3OB;7l5P#c3cD38o8@C4Q z9|}61+7hm_uH5YXu U;okp4v_Zde_mGy@KfUbuUk3o`A^-pY literal 0 HcmV?d00001 From 1269ff8b3fa44aa31128bda07bd121fbf5817f43 Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Fri, 27 Sep 2019 09:15:32 +0200 Subject: [PATCH 4/8] rewrite to support addon again --- CMakeLists.txt | 30 +- FindOpenGLES.cmake | 54 ++ FindOpenGl.cmake | 41 ++ depends/common/glm/flags.txt | 1 + depends/common/glm/glm.sha256 | 1 + depends/common/glm/glm.txt | 1 + depends/osx/glm/flags.txt | 1 + depends/osx/glm/glm.sha256 | 1 + depends/osx/glm/glm.txt | 1 + lib/kodi/gui/gl/GL.h | 105 +++ lib/kodi/gui/gl/Shader.h | 353 ++++++++++ src/StarBurst.cpp | 614 +++++++----------- src/StarBurst.h | 123 ++++ src/timer.h | 70 -- src/types.h | 220 ------- .../resources/shaders/GL/frag.glsl | 9 + .../resources/shaders/GL/vert.glsl | 14 + .../resources/shaders/GLES/frag.glsl | 10 + .../resources/shaders/GLES/vert.glsl | 14 + 19 files changed, 998 insertions(+), 665 deletions(-) create mode 100644 FindOpenGLES.cmake create mode 100644 FindOpenGl.cmake create mode 100644 depends/common/glm/flags.txt create mode 100644 depends/common/glm/glm.sha256 create mode 100644 depends/common/glm/glm.txt create mode 100644 depends/osx/glm/flags.txt create mode 100644 depends/osx/glm/glm.sha256 create mode 100644 depends/osx/glm/glm.txt create mode 100644 lib/kodi/gui/gl/GL.h create mode 100644 lib/kodi/gui/gl/Shader.h create mode 100644 src/StarBurst.h delete mode 100644 src/timer.h delete mode 100644 src/types.h create mode 100644 visualization.starburst/resources/shaders/GL/frag.glsl create mode 100644 visualization.starburst/resources/shaders/GL/vert.glsl create mode 100644 visualization.starburst/resources/shaders/GLES/frag.glsl create mode 100644 visualization.starburst/resources/shaders/GLES/vert.glsl diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f26297..510f819 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,22 +1,30 @@ +cmake_minimum_required(VERSION 3.5) project(visualization.starburst) -cmake_minimum_required(VERSION 2.6) - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}) find_package(Kodi REQUIRED) -find_package(OpenGL REQUIRED) - -add_definitions(-DHAS_SDL_OPENGL) -include_directories(${OpenGL_INCLUDE_DIR} - ${KODI_INCLUDE_DIR}) +find_package(glm REQUIRED) + +if(APP_RENDER_SYSTEM STREQUAL "gl" OR NOT APP_RENDER_SYSTEM) + find_package(OpenGl REQUIRED) + set(DEPLIBS ${OPENGL_LIBRARIES}) + set(includes ${OPENGL_INCLUDE_DIR}) + add_definitions(${OPENGL_DEFINITIONS}) +else() + find_package(OpenGLES REQUIRED) + set(DEPLIBS ${OPENGLES_LIBRARIES}) + set(includes ${OPENGLES_INCLUDE_DIR}) + add_definitions(${OPENGLES_DEFINITIONS}) +endif() + +include_directories(${GLM_INCLUDE_DIR} + ${KODI_INCLUDE_DIR}/.. # Hack way with "/..", need bigger Kodi cmake rework to match right include ways + ${PROJECT_SOURCE_DIR}/lib) set(STARBURST_SOURCES src/StarBurst.cpp) -set(STARBURST_HEADERS src/timer.h - src/types.h) - -SET(DEPLIBS ${OPENGL_LIBRARIES}) +set(STARBURST_HEADERS src/StarBurst.h) build_addon(visualization.starburst STARBURST DEPLIBS) diff --git a/FindOpenGLES.cmake b/FindOpenGLES.cmake new file mode 100644 index 0000000..f19eb62 --- /dev/null +++ b/FindOpenGLES.cmake @@ -0,0 +1,54 @@ +#.rst: +# FindOpenGLES +# ------------ +# Finds the OpenGLES2 library +# +# This will define the following variables:: +# +# OPENGLES_FOUND - system has OpenGLES +# OPENGLES_INCLUDE_DIRS - the OpenGLES include directory +# OPENGLES_LIBRARIES - the OpenGLES libraries +# OPENGLES_DEFINITIONS - the OpenGLES definitions + +if(CORE_PLATFORM_NAME_LC STREQUAL rbpi) + set(_brcmprefix brcm) +endif() + +if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_OPENGLES ${_brcmprefix}glesv2 QUIET) +endif() + +if(NOT CORE_SYSTEM_NAME STREQUAL darwin_embedded AND NOT CORE_SYSTEM_NAME STREQUAL ios) + find_path(OPENGLES_INCLUDE_DIR GLES2/gl2.h + PATHS ${PC_OPENGLES_INCLUDEDIR}) + find_library(OPENGLES_gl_LIBRARY NAMES ${_brcmprefix}GLESv2 + PATHS ${PC_OPENGLES_LIBDIR}) +else() + find_library(OPENGLES_gl_LIBRARY NAMES OpenGLES + PATHS ${CMAKE_OSX_SYSROOT}/System/Library + PATH_SUFFIXES Frameworks + NO_DEFAULT_PATH) + set(OPENGLES_INCLUDE_DIR ${OPENGLES_gl_LIBRARY}/Headers) +endif() + +find_path(OPENGLES3_INCLUDE_DIR GLES3/gl3.h) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenGLES + REQUIRED_VARS OPENGLES_gl_LIBRARY OPENGLES_INCLUDE_DIR) + +find_path(OPENGLES3_INCLUDE_DIR GLES3/gl3.h + PATHS ${PC_OPENGLES_INCLUDEDIR}) + +if(OPENGLES_FOUND) + set(OPENGLES_LIBRARIES ${OPENGLES_gl_LIBRARY}) + if(OPENGLES3_INCLUDE_DIR) + set(OPENGLES_INCLUDE_DIRS ${OPENGLES_INCLUDE_DIR} ${OPENGLES3_INCLUDE_DIR}) + set(OPENGLES_DEFINITIONS -DHAS_GLES=3) + mark_as_advanced(OPENGLES_INCLUDE_DIR OPENGLES3_INCLUDE_DIR OPENGLES_gl_LIBRARY) + else() + set(OPENGLES_INCLUDE_DIRS ${OPENGLES_INCLUDE_DIR}) + set(OPENGLES_DEFINITIONS -DHAS_GLES=2) + mark_as_advanced(OPENGLES_INCLUDE_DIR OPENGLES_gl_LIBRARY) + endif() +endif() diff --git a/FindOpenGl.cmake b/FindOpenGl.cmake new file mode 100644 index 0000000..ccde5e5 --- /dev/null +++ b/FindOpenGl.cmake @@ -0,0 +1,41 @@ +#.rst: +# FindOpenGl +# ---------- +# Finds the FindOpenGl library +# +# This will define the following variables:: +# +# OPENGL_FOUND - system has OpenGl +# OPENGL_INCLUDE_DIRS - the OpenGl include directory +# OPENGL_LIBRARIES - the OpenGl libraries +# OPENGL_DEFINITIONS - the OpenGl definitions + +if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_OPENGL gl QUIET) +endif() + +if(NOT CORE_SYSTEM_NAME STREQUAL osx) + find_path(OPENGL_INCLUDE_DIR GL/gl.h + PATHS ${PC_OPENGL_gl_INCLUDEDIR}) + find_library(OPENGL_gl_LIBRARY NAMES GL + PATHS ${PC_OPENGL_gl_LIBDIR}) +else() + find_library(OPENGL_gl_LIBRARY NAMES OpenGL + PATHS ${CMAKE_OSX_SYSROOT}/System/Library + PATH_SUFFIXES Frameworks + NO_DEFAULT_PATH) + set(OPENGL_INCLUDE_DIR ${OPENGL_gl_LIBRARY}/Headers) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenGl + REQUIRED_VARS OPENGL_gl_LIBRARY OPENGL_INCLUDE_DIR) + +if(OPENGL_FOUND) + set(OPENGL_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) + set(OPENGL_LIBRARIES ${OPENGL_gl_LIBRARY}) + set(OPENGL_DEFINITIONS -DHAS_GL=1) +endif() + +mark_as_advanced(OPENGL_INCLUDE_DIR OPENGL_gl_LIBRARY) + diff --git a/depends/common/glm/flags.txt b/depends/common/glm/flags.txt new file mode 100644 index 0000000..fb3a5c7 --- /dev/null +++ b/depends/common/glm/flags.txt @@ -0,0 +1 @@ +-DGLM_TEST_ENABLE_CXX_11=1 -DGLM_TEST_ENABLE=0 -DGLM_TEST_ENABLE_SIMD_SSE2=0 -DCMAKE_INSTALL_LIBDIR=lib diff --git a/depends/common/glm/glm.sha256 b/depends/common/glm/glm.sha256 new file mode 100644 index 0000000..a2281e4 --- /dev/null +++ b/depends/common/glm/glm.sha256 @@ -0,0 +1 @@ +7f093f11c49877716bab96813c2e834db6839095281c8c0c65c60c8bdb9504a3 diff --git a/depends/common/glm/glm.txt b/depends/common/glm/glm.txt new file mode 100644 index 0000000..eeb544e --- /dev/null +++ b/depends/common/glm/glm.txt @@ -0,0 +1 @@ +glm https://github.com/g-truc/glm/archive/47031aa4b7b079716e4cac496819e7f464b6a713.tar.gz diff --git a/depends/osx/glm/flags.txt b/depends/osx/glm/flags.txt new file mode 100644 index 0000000..bd18bd7 --- /dev/null +++ b/depends/osx/glm/flags.txt @@ -0,0 +1 @@ +-DGLM_TEST_ENABLE_CXX_11=1 -DGLM_TEST_ENABLE=0 -DGLM_TEST_ENABLE_SIMD_SSE2=1 -DCMAKE_INSTALL_LIBDIR=lib diff --git a/depends/osx/glm/glm.sha256 b/depends/osx/glm/glm.sha256 new file mode 100644 index 0000000..a2281e4 --- /dev/null +++ b/depends/osx/glm/glm.sha256 @@ -0,0 +1 @@ +7f093f11c49877716bab96813c2e834db6839095281c8c0c65c60c8bdb9504a3 diff --git a/depends/osx/glm/glm.txt b/depends/osx/glm/glm.txt new file mode 100644 index 0000000..eeb544e --- /dev/null +++ b/depends/osx/glm/glm.txt @@ -0,0 +1 @@ +glm https://github.com/g-truc/glm/archive/47031aa4b7b079716e4cac496819e7f464b6a713.tar.gz diff --git a/lib/kodi/gui/gl/GL.h b/lib/kodi/gui/gl/GL.h new file mode 100644 index 0000000..d8bd157 --- /dev/null +++ b/lib/kodi/gui/gl/GL.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +//============================================================================== +/// +/// \defgroup cpp_kodi_gui_gl Kodi OpenGL helpers +/// \ingroup cpp_kodi_gui +/// \brief Auxiliary functions for Open GL +/// +/// This group includes help for definitions, functions, and classes for +/// OpenGL. +/// +/// To use OpenGL for your system, add the \ref GL.h "#include ". +/// +/// +///----------------------------------------------------------------------------- +/// +/// The \ref HAS_GL is declared if Open GL is required and \ref HAS_GLES if Open GL +/// Embedded Systems (ES) is required, with ES the version is additionally given +/// in the definition, this can be "2" or "3". +/// +/// +///----------------------------------------------------------------------------- +/// +/// Following \ref GL_TYPE_STRING define can be used, for example, to manage +/// different folders for GL and GLES and make the selection easier. +/// This are on OpenGL **"`GL`"** and on Open GL|ES **"`GLES`"**. +/// **Example:** +/// ~~~~~~~~~~~~~~~~~{.cpp} +/// kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/frag.glsl"); +/// ~~~~~~~~~~~~~~~~~ +/// +/// +///---------------------------------------------------------------------------- +/// +/// In addition, \ref BUFFER_OFFSET is declared in it which can be used to give an +/// offset on the array to GL. +/// **Example:** +/// ~~~~~~~~~~~~~~~~~{.cpp} +/// const struct PackedVertex { +/// float position[3]; // Position x, y, z +/// float color[4]; // Color r, g, b, a +/// } vertices[3] = { +/// { { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, +/// { { 0.5f, -0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, +/// { { 0.0f, 0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } } +/// }; +/// +/// glVertexAttribPointer(m_aPosition, 3, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, position))); +/// glEnableVertexAttribArray(m_aPosition); +/// +/// glVertexAttribPointer(m_aColor, 4, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, color))); +/// glEnableVertexAttribArray(m_aColor); +/// ~~~~~~~~~~~~~~~~~ + +#if HAS_GL + #define GL_TYPE_STRING "GL" + // always define GL_GLEXT_PROTOTYPES before include gl headers + #if !defined(GL_GLEXT_PROTOTYPES) + #define GL_GLEXT_PROTOTYPES + #endif + #if defined(TARGET_LINUX) + #include + #include + #elif defined(TARGET_FREEBSD) + #include + #elif defined(TARGET_DARWIN) + #include + #include + #elif defined(WIN32) + #error Use of GL under Windows is not possible + #endif +#elif HAS_GLES >= 2 + #define GL_TYPE_STRING "GLES" + #if defined(WIN32) + #error Use of GLES under Windows is not possible + #elif defined(TARGET_DARWIN) + #if HAS_GLES == 3 + #include + #include + #else + #include + #include + #endif + #else + #if HAS_GLES == 3 + #include + #include + #else + #include + #include + #endif + #endif +#endif + +#ifndef BUFFER_OFFSET +#define BUFFER_OFFSET(i) ((char *)nullptr + (i)) +#endif diff --git a/lib/kodi/gui/gl/Shader.h b/lib/kodi/gui/gl/Shader.h new file mode 100644 index 0000000..61185da --- /dev/null +++ b/lib/kodi/gui/gl/Shader.h @@ -0,0 +1,353 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "GL.h" + +#include +#include +#include + +#include +#include + +#define LOG_SIZE 1024 +#define GLchar char + +namespace kodi +{ + namespace gui + { + namespace gl + { + //======================================================================== + /// CShader - base class + class ATTRIBUTE_HIDDEN CShader + { + public: + CShader() = default; + virtual ~CShader() = default; + virtual bool Compile(const std::string& extraBegin = "", + const std::string& extraEnd = "") = 0; + virtual void Free() = 0; + virtual GLuint Handle() = 0; + + bool LoadSource(const std::string& file) + { + char buffer[16384]; + + kodi::vfs::CFile source; + if (!source.OpenFile(file)) + { + kodi::Log(ADDON_LOG_ERROR, "CShader::%s: Failed to open file '%s'", __FUNCTION__, file.c_str()); + return false; + } + size_t len = source.Read(buffer, sizeof(buffer)); + m_source.assign(buffer); + m_source[len] = 0; + source.Close(); + return true; + } + + bool OK() { return m_compiled; } + + protected: + std::string m_source; + std::string m_lastLog; + bool m_compiled = false; + }; + //------------------------------------------------------------------------ + + //======================================================================== + /// CVertexShader + class ATTRIBUTE_HIDDEN CVertexShader : public CShader + { + public: + CVertexShader() = default; + ~CVertexShader() override { Free(); } + + void Free() override + { + if (m_vertexShader) + glDeleteShader(m_vertexShader); + m_vertexShader = 0; + } + + bool Compile(const std::string& extraBegin = "", + const std::string& extraEnd = "") override + { + GLint params[4]; + + Free(); + + m_vertexShader = glCreateShader(GL_VERTEX_SHADER); + + GLsizei count = 0; + const char *sources[3]; + if (!extraBegin.empty()) + sources[count++] = extraBegin.c_str(); + if (!m_source.empty()) + sources[count++] = m_source.c_str(); + if (!extraEnd.empty()) + sources[count++] = extraEnd.c_str(); + + glShaderSource(m_vertexShader, count, sources, nullptr); + glCompileShader(m_vertexShader); + glGetShaderiv(m_vertexShader, GL_COMPILE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CVertexShader::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CVertexShader::%s: %s\n", __FUNCTION__, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, nullptr, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; + } + + GLuint Handle() override { return m_vertexShader; } + + protected: + GLuint m_vertexShader = 0; + }; + //------------------------------------------------------------------------ + + //======================================================================== + /// CPixelShader + class ATTRIBUTE_HIDDEN CPixelShader : public CShader + { + public: + CPixelShader() = default; + ~CPixelShader() { Free(); } + void Free() override + { + if (m_pixelShader) + glDeleteShader(m_pixelShader); + m_pixelShader = 0; + } + + bool Compile(const std::string& extraBegin = "", + const std::string& extraEnd = "") override + { + GLint params[4]; + + Free(); + + if (m_source.length()==0) + return true; + + m_pixelShader = glCreateShader(GL_FRAGMENT_SHADER); + + GLsizei count = 0; + const char *sources[3]; + if (!extraBegin.empty()) + sources[count++] = extraBegin.c_str(); + if (!m_source.empty()) + sources[count++] = m_source.c_str(); + if (!extraEnd.empty()) + sources[count++] = extraEnd.c_str(); + + glShaderSource(m_pixelShader, count, sources, 0); + glCompileShader(m_pixelShader); + glGetShaderiv(m_pixelShader, GL_COMPILE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CPixelShader::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CPixelShader::%s: %s\n", __FUNCTION__, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, nullptr, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; + } + + GLuint Handle() override { return m_pixelShader; } + + protected: + GLuint m_pixelShader = 0; + }; + //------------------------------------------------------------------------ + + //======================================================================== + /// CShaderProgram + class ATTRIBUTE_HIDDEN CShaderProgram + { + public: + CShaderProgram() = default; + CShaderProgram(const std::string &vert, const std::string &frag) + { + LoadShaderFiles(vert, frag); + } + + virtual ~CShaderProgram() + { + ShaderFree(); + } + + bool LoadShaderFiles(const std::string &vert, const std::string &frag) + { + if (!kodi::vfs::FileExists(vert) || !m_pVP.LoadSource(vert)) + { + kodi::Log(ADDON_LOG_ERROR, "%s: Failed to load '%s'", __func__, vert.c_str()); + return false; + } + + if (!kodi::vfs::FileExists(frag) || !m_pFP.LoadSource(frag)) + { + kodi::Log(ADDON_LOG_ERROR, "%s: Failed to load '%s'", __func__, frag.c_str()); + return false; + } + + return true; + } + + bool CompileAndLink(const std::string& vertexExtraBegin = "", + const std::string& vertexExtraEnd = "", + const std::string& fragmentExtraBegin = "", + const std::string& fragmentExtraEnd = "") + { + GLint params[4]; + + // free resources + ShaderFree(); + m_ok = false; + + // compiled vertex shader + if (!m_pVP.Compile(vertexExtraBegin, vertexExtraEnd)) + { + kodi::Log(ADDON_LOG_ERROR, "GL: Error compiling vertex shader"); + return false; + } + + // compile pixel shader + if (!m_pFP.Compile(fragmentExtraBegin, fragmentExtraEnd)) + { + m_pVP.Free(); + kodi::Log(ADDON_LOG_ERROR, "GL: Error compiling fragment shader"); + return false; + } + + // create program object + if (!(m_shaderProgram = glCreateProgram())) + { + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: Failed to create GL program", __FUNCTION__); + ShaderFree(); + return false; + } + + // attach the vertex shader + glAttachShader(m_shaderProgram, m_pVP.Handle()); + glAttachShader(m_shaderProgram, m_pFP.Handle()); + + // link the program + glLinkProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CShaderProgram::%s: %s\n", __FUNCTION__, log); + ShaderFree(); + return false; + } + + m_validated = false; + m_ok = true; + OnCompiledAndLinked(); + return true; + } + + bool EnableShader() + { + if (ShaderOK()) + { + glUseProgram(m_shaderProgram); + if (OnEnabled()) + { + if (!m_validated) + { + // validate the program + GLint params[4]; + glValidateProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_VALIDATE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CShaderProgram::%s: %s\n", __FUNCTION__, log); + } + m_validated = true; + } + return true; + } + else + { + glUseProgram(0); + return false; + } + return true; + } + return false; + } + + void DisableShader() + { + if (ShaderOK()) + { + glUseProgram(0); + OnDisabled(); + } + } + + ATTRIBUTE_FORCEINLINE bool ShaderOK() { return m_ok; } + ATTRIBUTE_FORCEINLINE CVertexShader& VertexShader() { return m_pVP; } + ATTRIBUTE_FORCEINLINE CPixelShader& PixelShader() { return m_pFP; } + ATTRIBUTE_FORCEINLINE GLuint ProgramHandle() { return m_shaderProgram; } + + virtual void OnCompiledAndLinked() {}; + virtual bool OnEnabled() { return false; }; + virtual void OnDisabled() {}; + + private: + void ShaderFree() + { + if (m_shaderProgram) + glDeleteProgram(m_shaderProgram); + m_shaderProgram = 0; + m_ok = false; + } + + CVertexShader m_pVP; + CPixelShader m_pFP; + GLuint m_shaderProgram = 0; + bool m_ok = false; + bool m_validated = false; + }; + //------------------------------------------------------------------------ + } /* namespace gl */ + } /* namespace gui */ +} /* namespace kodi */ diff --git a/src/StarBurst.cpp b/src/StarBurst.cpp index ad90b83..d65e4be 100644 --- a/src/StarBurst.cpp +++ b/src/StarBurst.cpp @@ -1,242 +1,190 @@ // // -// StarBurst.cpp ::: This Is the Starburst XBMC Visualization -// V0.75 Written by Dinomight -// dylan@castlegate.net -// +// StarBurst.cpp ::: This Is the Starburst XBMC Visualization +// V0.75 Written by Dinomight +// dylan@castlegate.net +// // // ////////////////////////////////////////////////////////////////////// -#include -#include -#include "types.h" -#include "timer.h" -#include -#include - -#include -#include -#include - -typedef enum _WEIGHT { - WEIGHT_NONE = 0, - WEIGHT_A = 1, - WEIGHT_B = 2, - WEIGHT_C = 3 -} WEIGHT; - -#define sqr(x) (x*x) - - -#define FREQ_DATA_SIZE 512 // size of frequency data wanted -#define MAX_BARS 256 // number of bars in the Spectrum -#define MIN_PEAK_DECAY_SPEED 0 // decay speed in dB/frame -#define MAX_PEAK_DECAY_SPEED 4 -#define MIN_RISE_SPEED 0.01f // fraction of actual rise to allow -#define MAX_RISE_SPEED 1 -#define MIN_FALL_SPEED 0.01f // fraction of actual fall to allow -#define MAX_FALL_SPEED 1 -#define MIN_FREQUENCY 1 // allowable frequency range -#define MAX_FREQUENCY 24000 -#define MIN_LEVEL 0 // allowable level range -#define MAX_LEVEL 96 -#define TEXTURE_HEIGHT 256 -#define TEXTURE_MID 128 -#define TEXTURE_WIDTH 1 -#define MAX_CHANNELS 2 - - float m_pScreen[MAX_BARS*2]; // Current levels on the screen - float m_pPeak[MAX_BARS*2]; // Peak levels - float m_pWeight[FREQ_DATA_SIZE/2+1]; // A/B/C weighted levels for speed - float m_pFreq[MAX_BARS*2]; // Frequency data - - - int m_iSampleRate; - int m_width; - int m_height; - float m_centerx; - float m_centery; - float m_fRotation=0.0f; - float angle=0.0f; - - float startradius; //radius at which to start each bar - float minbar; //minimum length of a bar - float spinrate; // rate at witch to spin vis - double timepassed; - double lasttime = 0.0; - double currenttime = 0.0; - - float r1; //floats used for bar colors; - float g1; - float b1; - float a1; - float r2; - float g2; - float b2; - float a2; - - int m_iBars; // number of bars to draw - bool m_bLogScale; // true if our frequency is on a log scale - bool m_bShowPeaks; // show peaks? - bool m_bAverageLevels; // show average levels? - float m_fPeakDecaySpeed; // speed of decay (in dB/frame) - float m_fRiseSpeed; // division of rise to actually go up - float m_fFallSpeed; // division of fall to actually go up - float m_fMinFreq; // wanted frequency range - float m_fMaxFreq; - float m_fMinLevel; // wanted level range - float m_fMaxLevel; - WEIGHT m_Weight; // weighting type to be applied - bool m_bMixChannels; // Mix channels, or stereo? - bool m_bSeperateBars; - - - - #define POLE1 20.598997*20.598997 // for A/B/C weighting - #define POLE2 12194.217*12194.217 // for A/B/C weighting - #define POLE3 107.65265*107.65265 // for A weighting - #define POLE4 737.86223*737.86223 // for A weighting - #define POLE5 158.5*158.5 // for B weighting - - -// A structure for our custom vertex type -struct CUSTOMVERTEX -{ - float x, y, z, rhw; // The transformed position for the vertex - CRGBA color; // The vertex color -}; - - -CUSTOMVERTEX g_Vertices[MAX_BARS*4]; -CTimer gTimer; -int inline sign(float a) {return (a>0) ? 1 : -1;} +#include "StarBurst.h" -int htoi(char *str) /* Convert hex string to integer */ +CVisualizationStarBurst::CVisualizationStarBurst() { - unsigned int digit, number = 0; - while (*str) - { - if (isdigit(*str)) - digit = *str - '0'; - else - digit = tolower(*str)-'a'+10; - number<<=4; - number+=digit; - str++; - } - return number; + m_width = Width(); + m_height = Height(); + m_centerx = m_width/2.0f + X(); + m_centery = m_height/2.0f + Y(); + SetDefaults(); + CreateArrays(); } -void CreateArrays() +bool CVisualizationStarBurst::Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) { - CUSTOMVERTEX nullV = { 0.0f, 0.0f, 0.0f, 0.0f, CRGBA(0, 0, 0, 0), }; + (void)channels; + (void)bitsPerSample; + (void)songName; - for (int i=0; i(std::chrono::system_clock::now().time_since_epoch()).count(); + m_startOK = true; + return true; } -extern "C" void SetDefaults() +void CVisualizationStarBurst::Stop() { - m_iBars = 40; - m_bLogScale=false; - m_fPeakDecaySpeed=0.5f; - m_fRiseSpeed=0.5f; - m_fFallSpeed=0.5f; - m_Weight = WEIGHT_NONE; - m_bMixChannels = true; - m_fMinFreq = 80; - m_fMaxFreq = 16000; - m_fMinLevel = 0; - m_fMaxLevel = 0.2; - m_bShowPeaks = true; - m_bAverageLevels = false; - spinrate = 1.0/3.0; - startradius = 0.0f; - minbar = 200.0f; - //inital color - r2 = 255; - g2 = 200; - b2 = 0; - a2 = 255; - //finalColor - r1 = 163; - g1 = 192; - b1 = 255; - a1 = 255; - // color Diff - r2 -= r1; - g2 -= g1; - b2 -= b1; - a2 -= a1; + if (!m_startOK) + return; + + m_startOK = false; + +#ifdef HAS_GL + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDeleteBuffers(2, m_vertexVBO); + m_vertexVBO[0] = 0; + m_vertexVBO[1]= 0; +#endif } -bool InitGeometry() +void CVisualizationStarBurst::Render() { - // Initialize vertices for rendering a triangle - CUSTOMVERTEX m_Vertices[] = + if (!m_startOK) + return; + + double currentTime = std::chrono::duration(std::chrono::system_clock::now().time_since_epoch()).count(); + double timepassed = currentTime - m_oldTime; + m_oldTime = currentTime; + + float PI = 3.141592653589793f; + float devisions = (2.0f*PI)/(m_iBars); + float dwidth = devisions/2.3f; + + m_angle += (2.0f*PI)/(spinrate)*(timepassed/25.0); + + for (int i=0; i < m_iBars*2; i++) + { + // truncate data to the users range + if (m_pFreq[i] > m_fMaxLevel) + m_pFreq[i] = m_fMaxLevel; + m_pFreq[i]-=m_fMinLevel; + if (m_pFreq[i] < 0) + m_pFreq[i] = 0; + // Smooth out the movement + if (m_pFreq[i] > m_pScreen[i]) + m_pScreen[i] += (m_pFreq[i]-m_pScreen[i])*m_fRiseSpeed; + else + m_pScreen[i] -= (m_pScreen[i]-m_pFreq[i])*m_fFallSpeed; + // Work out the peaks + if (m_pScreen[i] >= m_pPeak[i]) { - { 200.0f, 200.0f, 0.5f, 1.0f, CRGBA(0, 255, 0, 255) }, // x, y, z, rhw, color - { 300.0f, 200.0f, 0.5f, 1.0f, CRGBA(0, 255, 0, 255) }, - { 300.0f, 300.0f, 0.5f, 1.0f, CRGBA(0, 255, 0, 255) }, - { 200.0f, 300.0f, 0.5f, 1.0f, CRGBA(0, 255, 0, 255) }, - { 200.0f, 300.0f, 0.5f, 1.0f, CRGBA(0, 255, 0, 255) }, - }; - - memcpy(g_Vertices, m_Vertices, sizeof(m_Vertices)); - return true; -} + m_pPeak[i] = m_pScreen[i]; + } + else + { + m_pPeak[i]-=m_fPeakDecaySpeed; + if (m_pPeak[i] < 0) + m_pPeak[i] = 0; + } + } -ADDON_STATUS ADDON_Create(void* hdl, void* props) -{ - if (!props) - return ADDON_STATUS_UNKNOWN; + if (m_angle >2.0f*PI) + m_angle -= 2.0f*PI; + float x1 = 0; + float y1 = 0; + float x2 = 0; + float y2 = 0; + float radius=0; + int iChannels = m_bMixChannels ? 1 : 2; - AddonProps_Visualization* visProps = (AddonProps_Visualization*)props; + // for (int j=0; jwidth; - m_height = visProps->height; - m_centerx = m_width/2.0f + visProps->x; - m_centery = m_height/2.0f + visProps->y; - SetDefaults(); - CreateArrays(); + int points = 4; + float scaler = (m_height/2 - minbar - startradius)/(m_fMaxLevel - m_fMinLevel); + glm::vec4 color1 = glm::vec4(m_r1, m_g1, m_b1, m_a1); + for (int i=0; i < m_iBars*2; i+=2) + { + radius = m_pScreen[i+j] * scaler + minbar + startradius; - return ADDON_STATUS_OK; -} + x1 = sin(m_angle - dwidth) * radius; + y1 = cos(m_angle - dwidth) * radius; + x2 = sin(m_angle + dwidth) * radius; + y2 = cos(m_angle + dwidth) * radius; + float x3 = sin(m_angle) * startradius; + float y3 = cos(m_angle) * startradius; -extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) -{ - m_iSampleRate = iSamplesPerSec; - CreateArrays(); + float colorscaler = ((m_pScreen[i+j])/(m_fMaxLevel - m_fMinLevel)); - InitGeometry(); - gTimer.Init(); + glm::vec4 color2 = glm::vec4(((colorscaler*m_r2)+m_r1), + ((colorscaler*m_g2)+m_g1), + ((colorscaler*m_b2)+m_b1), + ((colorscaler*m_a2)+m_a1)); + //color1 = color2; + glm::vec4 b = glm::vec4(m_centerx + x3, m_centery + y3, 0.5f, 1.0f); + glm::vec4 a1 = glm::vec4(m_centerx + x1, m_centery + y1, 0.5f, 1.0f); + glm::vec4 a2 = glm::vec4(m_centerx + x2, m_centery + y2, 0.5f, 1.0f); + m_positions[(((i+2)/2 -1)*points)] = b; + m_colors[(((i+2)/2 -1)*points)] = color2; + m_positions[(((i+2)/2 -1)*points)+1] = a1; + m_colors[(((i+2)/2 -1)*points)+1] = color2; + m_positions[(((i+2)/2 -1)*points)+2] = a2; + m_colors[(((i+2)/2 -1)*points)+2] = color2; + m_positions[(((i+2)/2 -1)*points)+3] = b; + m_colors[(((i+2)/2 -1)*points)+3] = color2; + + m_angle += devisions; + } + +#ifdef HAS_GL + glBindBuffer(GL_ARRAY_BUFFER, m_vertexVBO[0]); + glVertexAttribPointer(m_aPosition, 4, GL_FLOAT, GL_FALSE, sizeof(glm::vec4), BUFFER_OFFSET(offsetof(glm::vec4, x))); + glEnableVertexAttribArray(m_aPosition); + glBufferData(GL_ARRAY_BUFFER, sizeof(m_positions), m_positions, GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, m_vertexVBO[1]); + glVertexAttribPointer(m_aColor, 4, GL_FLOAT, GL_FALSE, sizeof(glm::vec4), BUFFER_OFFSET(offsetof(glm::vec4, r))); + glEnableVertexAttribArray(m_aColor); + glBufferData(GL_ARRAY_BUFFER, sizeof(m_colors), m_colors, GL_STATIC_DRAW); +#else + glVertexAttribPointer(m_aPosition, 4, GL_FLOAT, GL_FALSE, 0, m_positions); + glEnableVertexAttribArray(m_aPosition); + + glVertexAttribPointer(m_aColor, 4, GL_FLOAT, GL_FALSE, 0, m_colors); + glEnableVertexAttribArray(m_aColor); +#endif + + glDisable(GL_BLEND); + EnableShader(); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, m_iBars*4-2); + + DisableShader(); + glEnable(GL_BLEND); + + glDisableVertexAttribArray(m_aPosition); + glDisableVertexAttribArray(m_aColor); } -extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +void CVisualizationStarBurst::AudioData(const float* pAudioData, int iAudioDataLength, float* pFreqData, int iFreqDataLength) { if (iFreqDataLength>FREQ_DATA_SIZE) iFreqDataLength = FREQ_DATA_SIZE; @@ -245,8 +193,8 @@ extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float * { for (int i=0; i>1]; - pFreqData[i+1]*=m_pWeight[i>>1]; + pFreqData[i] *= m_pWeight[i>>1]; + pFreqData[i+1] *= m_pWeight[i>>1]; } } // Group data into frequency bins by averaging (Ignore the constant term) @@ -255,7 +203,7 @@ extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float * // FIXME: Roll conditionals out of loop for (int i=0, iBin=0; i < m_iBars; i++, iBin+=2) { - m_pFreq[iBin]=0.000001f; // almost zero to avoid taking log of zero later + m_pFreq[iBin]=0.000001f; // almost zero to avoid taking log of zero later m_pFreq[iBin+1]=0.000001f; if (m_bLogScale) jmax = (int) (m_fMinFreq*pow(m_fMaxFreq/m_fMinFreq,(float)i/m_iBars)/m_iSampleRate*iFreqDataLength + 0.5f); @@ -271,7 +219,7 @@ extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float * { if (m_bAverageLevels) m_pFreq[iBin]+=pFreqData[j]+pFreqData[j+1]; - else + else { if (pFreqData[j]>m_pFreq[iBin]) m_pFreq[iBin]=pFreqData[j]; @@ -309,175 +257,113 @@ extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float * } } -extern "C" void Render() +void CVisualizationStarBurst::OnCompiledAndLinked() { - gTimer.Update(); - - timepassed = gTimer.GetDeltaTime(); - - float PI = 3.141592653589793f; - float devisions = (2.0f*PI)/(m_iBars); - float dwidth = devisions/2.3f; - - angle += (2.0f*PI)/(spinrate)*(timepassed/25.0); - - for (int i=0; i < m_iBars*2; i++) - { - // truncate data to the users range - if (m_pFreq[i] > m_fMaxLevel) - m_pFreq[i] = m_fMaxLevel; - m_pFreq[i]-=m_fMinLevel; - if (m_pFreq[i] < 0) - m_pFreq[i] = 0; - // Smooth out the movement - if (m_pFreq[i] > m_pScreen[i]) - m_pScreen[i] += (m_pFreq[i]-m_pScreen[i])*m_fRiseSpeed; - else - m_pScreen[i] -= (m_pScreen[i]-m_pFreq[i])*m_fFallSpeed; - // Work out the peaks - if (m_pScreen[i] >= m_pPeak[i]) - { - m_pPeak[i] = m_pScreen[i]; - } - else - { - m_pPeak[i]-=m_fPeakDecaySpeed; - if (m_pPeak[i] < 0) - m_pPeak[i] = 0; - } - } - - if (angle >2.0f*PI) - angle -= 2.0f*PI; - float x1 = 0; - float y1 = 0; - float x2 = 0; - float y2 = 0; - float radius=0; - int iChannels = m_bMixChannels ? 1 : 2; - - // for (int j=0; jbWantsFreq = true; - pInfo->iSyncDelay = 16; + return true; } -//-- Destroy ------------------------------------------------------------------ -// Do everything before unload of this add-on -// !!! Add-on master function !!! -//----------------------------------------------------------------------------- -extern "C" void ADDON_Destroy() +void CVisualizationStarBurst::CreateArrays() { -} + for (int i=0; i +#include +#include + +#include +#include + +typedef enum _WEIGHT { + WEIGHT_NONE = 0, + WEIGHT_A = 1, + WEIGHT_B = 2, + WEIGHT_C = 3 +} WEIGHT; + +#define sqr(x) (x*x) + +#define FREQ_DATA_SIZE 512 // size of frequency data wanted +#define MAX_BARS 256 // number of bars in the Spectrum +#define MIN_PEAK_DECAY_SPEED 0 // decay speed in dB/frame +#define MAX_PEAK_DECAY_SPEED 4 +#define MIN_RISE_SPEED 0.01f // fraction of actual rise to allow +#define MAX_RISE_SPEED 1 +#define MIN_FALL_SPEED 0.01f // fraction of actual fall to allow +#define MAX_FALL_SPEED 1 +#define MIN_FREQUENCY 1 // allowable frequency range +#define MAX_FREQUENCY 24000 +#define MIN_LEVEL 0 // allowable level range +#define MAX_LEVEL 96 +#define TEXTURE_HEIGHT 256 +#define TEXTURE_MID 128 +#define TEXTURE_WIDTH 1 +#define MAX_CHANNELS 2 + +#define POLE1 20.598997*20.598997 // for A/B/C weighting +#define POLE2 12194.217*12194.217 // for A/B/C weighting +#define POLE3 107.65265*107.65265 // for A weighting +#define POLE4 737.86223*737.86223 // for A weighting +#define POLE5 158.5*158.5 // for B weighting + +class ATTRIBUTE_HIDDEN CVisualizationStarBurst + : public kodi::addon::CAddonBase, + public kodi::addon::CInstanceVisualization, + public kodi::gui::gl::CShaderProgram +{ +public: + CVisualizationStarBurst(); + ~CVisualizationStarBurst() override = default; + + bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) override; + void Stop() override; + void Render() override; + void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) override; + void GetInfo(bool& wantsFreq, int& syncDelay) override { wantsFreq = true; syncDelay = 16; } + + void OnCompiledAndLinked() override; + bool OnEnabled() override; + +private: + bool InitGeometry(); + void CreateArrays(); + void SetDefaults(); + + float m_fWaveform[2][512]; + + glm::mat4 m_modelProjMat; + +#ifdef HAS_GL + GLuint m_vertexVBO[2] = { 0 }; +#endif + GLint m_uModelProjMatrix = -1; + GLint m_aPosition = -1; + GLint m_aColor = -1; + + bool m_startOK = false; + + float m_pScreen[MAX_BARS*2]; // Current levels on the screen + float m_pPeak[MAX_BARS*2]; // Peak levels + float m_pWeight[FREQ_DATA_SIZE/2+1]; // A/B/C weighted levels for speed + float m_pFreq[MAX_BARS*2]; // Frequency data + + int m_iSampleRate; + int m_width; + int m_height; + float m_centerx; + float m_centery; + float m_fRotation = 0.0f; + float m_angle = 0.0f; + + float startradius; //radius at which to start each bar + float minbar; //minimum length of a bar + float spinrate; // rate at witch to spin vis + + float m_r1; //floats used for bar colors; + float m_g1; + float m_b1; + float m_a1; + float m_r2; + float m_g2; + float m_b2; + float m_a2; + + int m_iBars; // number of bars to draw + bool m_bLogScale; // true if our frequency is on a log scale + bool m_bShowPeaks; // show peaks? + bool m_bAverageLevels; // show average levels? + float m_fPeakDecaySpeed; // speed of decay (in dB/frame) + float m_fRiseSpeed; // division of rise to actually go up + float m_fFallSpeed; // division of fall to actually go up + float m_fMinFreq; // wanted frequency range + float m_fMaxFreq; + float m_fMinLevel; // wanted level range + float m_fMaxLevel; + WEIGHT m_Weight; // weighting type to be applied + bool m_bMixChannels; // Mix channels, or stereo? + bool m_bSeperateBars; + + glm::vec4 m_positions[MAX_BARS*4]; // The transformed position for the vertex + glm::vec4 m_colors[MAX_BARS*4]; // The vertex color + + double m_oldTime; +}; diff --git a/src/timer.h b/src/timer.h deleted file mode 100644 index db648f0..0000000 --- a/src/timer.h +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Author: -// Joakim Eriksson -// -//////////////////////////////////////////////////////////////////////////// - -#pragma once - -#include "types.h" -#include - -/***************************** D E F I N E S *******************************/ -/****************************** M A C R O S ********************************/ -/************************** S T R U C T U R E S ****************************/ - -//////////////////////////////////////////////////////////////////////////// -// -class CTimer -{ -public: - - CTimer(); - void Init(void); - void Update(void); - f32 GetDeltaTime(void); - -protected: - double m_OldCount; - f32 m_DeltaTime; - - static double WallTime () - { - timeval tmpTime; - gettimeofday(&tmpTime,NULL); - return tmpTime.tv_sec + tmpTime.tv_usec/1.0e6; - } -}; - -/***************************** G L O B A L S *******************************/ -/***************************** I N L I N E S *******************************/ - -//////////////////////////////////////////////////////////////////////////// -// -inline CTimer::CTimer() -{ - m_DeltaTime = 0.0f; -} - -//////////////////////////////////////////////////////////////////////////// -// -inline void CTimer::Init(void) -{ - m_OldCount = WallTime(); -} - -//////////////////////////////////////////////////////////////////////////// -// -inline void CTimer::Update(void) -{ - m_DeltaTime = WallTime()-m_OldCount; - m_OldCount = WallTime(); -} - -//////////////////////////////////////////////////////////////////////////// -// -inline f32 CTimer::GetDeltaTime(void) -{ - return m_DeltaTime; -} diff --git a/src/types.h b/src/types.h deleted file mode 100644 index 97dd54b..0000000 --- a/src/types.h +++ /dev/null @@ -1,220 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// This contains the types and math classes that I'm used to work with. -// They have been stipped of most unneeded stuff that isn't needed in -// the screensaver -// -// Author: -// Joakim Eriksson -// -//////////////////////////////////////////////////////////////////////////// - -#pragma once - -#include -#include -#include - -/***************************** D E F I N E S *******************************/ - -typedef signed char s8; -typedef unsigned char u8; -typedef signed short s16; -typedef unsigned short u16; -typedef signed long s32; -typedef unsigned long u32; -typedef int64_t s64; -typedef uint64_t u64; -typedef float f32; -typedef double f64; -#define null 0 - -const f32 PI = 3.14159265358979323846f; -const f32 FLOATEPSILON = 0.00001f; - -/****************************** M A C R O S ********************************/ - -#define SAFE_DELETE(_p) { if(_p) { delete _p; _p=NULL; } } -#define SAFE_DELETE_ARRAY(_p) { if(_p) { delete [] _p; _p=NULL; } } -#define SAFE_RELEASE(_p) { if(_p) { _p->Release(); _p=NULL; } } - -// Direct 3d verify -#define DVERIFY( _func ) \ - { \ - HRESULT _retCode = _func; \ - if( _retCode != D3D_OK) \ - { \ - char buf[2000]; \ - sprintf(buf, "\""#_func"\" returned 0x%lx in\n" __FILE__ "(%ld)\n", _retCode, __LINE__); \ - OutputDebugString(buf); \ - return false; \ - } \ - } - -#define DEGTORAD(d) ((d)*(PI / 180.0f)) -#define RADTODEG(r) ((r)*(180.0f / PI)) -#define assert(_x) - -/***************************** C L A S S E S *******************************/ - -//////////////////////////////////////////////////////////////////////////// -// -class CRGBA -{ -public: - union - { - f32 col[4]; - struct - { - f32 r,g,b,a; - }; - }; - - CRGBA() { col[0] = col[1] = col[2] = 1.0f; col[3] = 1.0f; } - CRGBA(f32 R, f32 G, f32 B, f32 A) { col[0]=R; col[1]=G; col[2]=B; col[3]=A; } - u32 RenderColor(void) const; - void Set(f32 R, f32 G, f32 B, f32 A) { col[0]=R; col[1]=G; col[2]=B; col[3]=A; } - CRGBA& operator = (const CRGBA& c) { r = c.r; g = c.g; b = c.b; a = c.a; return *this; } -}; - -//////////////////////////////////////////////////////////////////////////// -// -class CVector -{ -public: - CVector() { } - CVector(f32 _x, f32 _y, f32 _z) { x = _x; y = _y; z = _z; } - void Zero() { x = y = z = 0.0f; } - void Set(f32 _x, f32 _y, f32 _z) { x = _x; y = _y; z = _z; } - - f32 x; - f32 y; - f32 z; -}; - -//////////////////////////////////////////////////////////////////////////// -// -class CMatrix -{ -public: - void Identity(void); - void Rotate(f32 angleX, f32 angleY, f32 angleZ); - void Scale(f32 sx, f32 sy, f32 sz) { _11 *= sx; _22 *= sy; _33 *= sz; } - void Multiply(const CMatrix& m1, const CMatrix& m2); - CVector operator * ( const CVector& v ) const; - - f32 _11; - f32 _12; - f32 _13; - f32 _14; - f32 _21; - f32 _22; - f32 _23; - f32 _24; - f32 _31; - f32 _32; - f32 _33; - f32 _34; - f32 _41; - f32 _42; - f32 _43; - f32 _44; -}; - -/***************************** G L O B A L S *******************************/ -/***************************** I N L I N E S *******************************/ - -inline f32 Clamp(f32 x, f32 min, f32 max) { return (x <= min ? min : (x >= max ? max : x)); } -inline f32 RandFloat(void) { return (1.0f / RAND_MAX) * ((f32)rand()); } -inline int ISEQUAL(f32 a,f32 b,f32 absprec) { return (fabs((a)-(b))<=absprec); } -inline int Rand(int max) { return rand() % max; } - -//////////////////////////////////////////////////////////////////////////// -// A fast float to int version -inline s32 FloatToInt(f32 f) -{ - return (s32)f; -// s32 res; -// __asm fld f -// __asm fistp res -// return res; -} - -//////////////////////////////////////////////////////////////////////////// -// Converts a float (0.0-1.0) to 0-255 -inline u8 FloatToByte(f32 fval) -{ - if (fval >= 1.0f) return 255; - if (fval <= 0.0f) return 0; - return (u8)FloatToInt(fval * 255.5f); -} - -//////////////////////////////////////////////////////////////////////////// -// Returns a u32 color data, which is used in rendering. -// -inline u32 CRGBA::RenderColor(void) const -{ - return ((((u32)FloatToByte(a) << 24) | ( (u32)FloatToByte(r) << 16) | ( (u32)FloatToByte(g) << 8) | (u32)FloatToByte(b))); -} - -//////////////////////////////////////////////////////////////////////////// -// -inline void CMatrix::Identity(void) -{ - _12 = _13 = _14 = 0.0f; - _21 = _23 = _24 = 0.0f; - _31 = _32 = _34 = 0.0f; - _41 = _42 = _43 = 0.0f; - _11 = _22 = _33 = _44 = 1.0f; -} - -//////////////////////////////////////////////////////////////////////////// -// Create a rotation matrix -// -inline void CMatrix::Rotate(f32 angleX, f32 angleY, f32 angleZ) -{ - //D3DXMatrixRotationYawPitchRoll(this, DEGTORAD(angleX), DEGTORAD(angleY), DEGTORAD(angleZ)); -} - -//////////////////////////////////////////////////////////////////////////// -// -inline CVector CMatrix::operator * ( const CVector& v ) const -{ - return CVector( v.x * _11 + v.y * _21 + v.z * _31 + _41, - v.x * _12 + v.y * _22 + v.z * _32 + _42, - v.x * _13 + v.y * _23 + v.z * _33 + _43); -} - -//////////////////////////////////////////////////////////////////////////// -// -inline void CMatrix::Multiply(const CMatrix& m1, const CMatrix& m2) -{ - CMatrix m; - //D3DXMatrixMultiply(&m, &m2, &m1); - *this = m; -} - -//////////////////////////////////////////////////////////////////////////// -// -inline f32 DotProduct(const CVector& v1, const CVector& v2) -{ - return v1.x*v2.x + v1.y * v2.y + v1.z*v2.z; -} - -//////////////////////////////////////////////////////////////////////////// -// -inline f32 InterpolateFloat(f32 v1, f32 v2, f32 t, bool linear) -{ - assert((t >= 0.0f) && (t <= 1.0f)); - if (linear) - { - return v1 + t*(v2 - v1); - } - - // Compute Hermite spline coefficients for t, where 0 <= t <= 1. - f32 t2 = t * t; - f32 t3 = t * t2; - f32 z = 3.0f * t2 - t3 - t3; - return v1*(1.0f - z) + v2*z; -} - diff --git a/visualization.starburst/resources/shaders/GL/frag.glsl b/visualization.starburst/resources/shaders/GL/frag.glsl new file mode 100644 index 0000000..502b2ad --- /dev/null +++ b/visualization.starburst/resources/shaders/GL/frag.glsl @@ -0,0 +1,9 @@ +#version 150 + +in vec4 v_color; +out vec4 FragColor; + +void main() +{ + FragColor = v_color; +} diff --git a/visualization.starburst/resources/shaders/GL/vert.glsl b/visualization.starburst/resources/shaders/GL/vert.glsl new file mode 100644 index 0000000..24d9fad --- /dev/null +++ b/visualization.starburst/resources/shaders/GL/vert.glsl @@ -0,0 +1,14 @@ +#version 150 + +uniform mat4 u_modelViewProjectionMatrix; + +in vec4 a_position; +in vec4 a_color; + +out vec4 v_color; + +void main() +{ + gl_Position = u_modelViewProjectionMatrix * a_position; + v_color = a_color; +} diff --git a/visualization.starburst/resources/shaders/GLES/frag.glsl b/visualization.starburst/resources/shaders/GLES/frag.glsl new file mode 100644 index 0000000..27c51aa --- /dev/null +++ b/visualization.starburst/resources/shaders/GLES/frag.glsl @@ -0,0 +1,10 @@ +#version 100 + +precision mediump float; + +varying vec4 v_color; + +void main() +{ + gl_FragColor = v_color; +} diff --git a/visualization.starburst/resources/shaders/GLES/vert.glsl b/visualization.starburst/resources/shaders/GLES/vert.glsl new file mode 100644 index 0000000..af2e076 --- /dev/null +++ b/visualization.starburst/resources/shaders/GLES/vert.glsl @@ -0,0 +1,14 @@ +#version 100 + +uniform mat4 u_modelViewProjectionMatrix; + +attribute vec4 a_position; +attribute vec4 a_color; + +varying vec4 v_color; + +void main() +{ + gl_Position = u_modelViewProjectionMatrix * a_position; + v_color = a_color; +} From 757f5bd31b6482ca30b21eab0f6743d17cf96534 Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Fri, 27 Sep 2019 09:02:12 +0200 Subject: [PATCH 5/8] add debian packaging --- debian/changelog.in | 6 ++++++ debian/compat | 1 + debian/control | 22 ++++++++++++++++++++ debian/copyright | 21 +++++++++++++++++++ debian/kodi-visualization-starburst.install | 2 ++ debian/rules | 23 +++++++++++++++++++++ debian/source/format | 1 + 7 files changed, 76 insertions(+) create mode 100644 debian/changelog.in create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/kodi-visualization-starburst.install create mode 100755 debian/rules create mode 100644 debian/source/format diff --git a/debian/changelog.in b/debian/changelog.in new file mode 100644 index 0000000..b0b4f99 --- /dev/null +++ b/debian/changelog.in @@ -0,0 +1,6 @@ +kodi-visualization-starburst (#PACKAGEVERSION#-#TAGREV#~#DIST#) #DIST#; urgency=low + + [ kodi ] + * autogenerated dummy changelog + + -- Nobody Sat, 01 Jun 2013 00:59:22 +0200 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..a67cd97 --- /dev/null +++ b/debian/control @@ -0,0 +1,22 @@ +Source: kodi-visualization-starburst +Priority: extra +Maintainer: Nobody +Build-Depends: debhelper (>= 9.0.0), cmake, kodi-addon-dev, + libgles2-mesa-dev [arm64 armhf], libgl1-mesa-dev [i386 amd64] +Standards-Version: 4.1.2 +Section: libs +Homepage: http://kodi.tv + +Package: kodi-visualization-starburst +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Starburst visualization for Kodi + starburst visualization for Kodi + +Package: kodi-visualization-starburst-dbg +Section: debug +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Debug symbols for starburst visualization for Kodi + debug symbols for starburst visualization for Kodi diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..27f91a6 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,21 @@ +Format: http://dep.debian.net/deps/dep5 +Upstream-Name: visualization.starburst + +Files: * +Copyright: 2005-2019 Team Kodi +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". diff --git a/debian/kodi-visualization-starburst.install b/debian/kodi-visualization-starburst.install new file mode 100644 index 0000000..db2d2dc --- /dev/null +++ b/debian/kodi-visualization-starburst.install @@ -0,0 +1,2 @@ +usr/lib/* +usr/share/* diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..6af11ce --- /dev/null +++ b/debian/rules @@ -0,0 +1,23 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +%: + dh $@ + +override_dh_auto_configure: + dh_auto_configure -- -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=1 -DUSE_LTO=1 + +override_dh_strip: + dh_strip --dbg-package=kodi-visualization-starburst-dbg + +override_dh_installdocs: + dh_installdocs --link-doc=kodi-visualization-starburst + diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) From 6d8fe055fc4878a4bf7ecac4f4a78636a49d087c Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Fri, 27 Sep 2019 09:23:33 +0200 Subject: [PATCH 6/8] add Jenkins and Travis for test builds --- .travis.yml | 45 +++++++++++++++++++++++++++++++++++++++++++++ Jenkinsfile | 1 + 2 files changed, 46 insertions(+) create mode 100644 .travis.yml create mode 100644 Jenkinsfile diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..ab4257f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,45 @@ +language: cpp + +# +# Define the build matrix +# +# Travis defaults to building on Ubuntu Trusty when building on +# Linux. We need Xenial in order to get up to date versions of +# cmake and g++. +# +env: + global: + - app_id=visualization.starburst + +matrix: + include: + - os: linux + dist: xenial + sudo: required + compiler: gcc + - os: linux + dist: xenial + sudo: required + compiler: clang + - os: osx + osx_image: xcode9 + - os: osx + osx_image: xcode9.4 + +before_install: + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get update -qq; fi + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev; fi + +# +# The addon source is automatically checked out in $TRAVIS_BUILD_DIR, +# we'll put the Kodi source on the same level +# +before_script: + - cd $TRAVIS_BUILD_DIR/.. + - git clone --branch Leia --depth=1 https://github.com/xbmc/xbmc.git + - cd ${app_id} && mkdir build && cd build + - mkdir -p definition/${app_id} + - echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt + - cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DADDONS_DEFINITION_DIR=$TRAVIS_BUILD_DIR/build/definition -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons + +script: make diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..8d89caf --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1 @@ +buildPlugin(version: "Leia", platforms: ['android-armv7', 'android-aarch64', 'ios-armv7', 'ios-aarch64', 'osx-x86_64', 'ubuntu-ppa']) From c9ae0b7358ba8d3f64ede673b6618cf00a56576d Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Fri, 27 Sep 2019 22:38:34 +0200 Subject: [PATCH 7/8] change addon.xml.in provider to 'Team Kodi' and add source and licence --- visualization.starburst/addon.xml.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/visualization.starburst/addon.xml.in b/visualization.starburst/addon.xml.in index de3defe..8b77f19 100644 --- a/visualization.starburst/addon.xml.in +++ b/visualization.starburst/addon.xml.in @@ -3,7 +3,7 @@ id="visualization.starburst" version="1.1.0" name="StarBurst" - provider-name="spiff"> + provider-name="Team Kodi"> @ADDON_DEPENDS@ StarBurst visualizer Frequency giving stars burst. @PLATFORM@ + GPL-2.0 + https://github.com/xbmc/visualization.starburst resources/icon.png resources/fanart.jpg From c3054aa374d12c25281fb87f704454c4df7adf3f Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Fri, 27 Sep 2019 09:02:44 +0200 Subject: [PATCH 8/8] increase version to 2.0.0 --- visualization.starburst/addon.xml.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visualization.starburst/addon.xml.in b/visualization.starburst/addon.xml.in index 8b77f19..20e0d56 100644 --- a/visualization.starburst/addon.xml.in +++ b/visualization.starburst/addon.xml.in @@ -1,7 +1,7 @@ @ADDON_DEPENDS@