From ccb8d1c4e70ae830c75f1066f08c9d82268bd03d Mon Sep 17 00:00:00 2001 From: Yeicor <4929005+Yeicor@users.noreply.github.com> Date: Sun, 3 Mar 2024 11:18:29 +0100 Subject: [PATCH] better logo (demo) --- assets/{logo.glb => logo_build/base.glb} | Bin assets/logo_build/img.jpg.glb | Bin 0 -> 17696 bytes assets/logo_build/location.glb | Bin 0 -> 3328 bytes src/misc/settings.ts | 10 ++++-- yacv_server/__init__.py | 6 +--- yacv_server/logo.py | 44 ++++++++++++++--------- yacv_server/pubsub.py | 4 +++ yacv_server/server.py | 22 ++++++------ 8 files changed, 52 insertions(+), 34 deletions(-) rename assets/{logo.glb => logo_build/base.glb} (100%) create mode 100644 assets/logo_build/img.jpg.glb create mode 100644 assets/logo_build/location.glb diff --git a/assets/logo.glb b/assets/logo_build/base.glb similarity index 100% rename from assets/logo.glb rename to assets/logo_build/base.glb diff --git a/assets/logo_build/img.jpg.glb b/assets/logo_build/img.jpg.glb new file mode 100644 index 0000000000000000000000000000000000000000..62948c90a559df7fce44b682eb8f97428d07916d GIT binary patch literal 17696 zcmb`v1zc2b+b+6jMG(P3DWy}Ip=$u?X0Rxw8M?a^35S++KtN&u5m0GCP>>c$K|w%T zK#=Y@&*1-k-|yRJpZ(is|MsY})-$WubLVwmx3-RkD)GcSu94ojncx zT&-E8M1_P!d0CuY+?~uFQU2CeEK)Y+jvm&y{k)vP5n{Y7o@YCODNU-h=KlE}ZW$tNVjFDN33`-llih>8db zi}Q-Y`2~4}#P|jOeLw%Ry+ptcynJW7{f{>*@_+Sah5voCLb&_-FSjKK#^9f65V%ou zkF)6rV6nA!wstr7ba7{qV(~M#^uF(5?e1;uju7Mrhk{dqbq|yac*`upU>pQ)_1}~G zUnl!)X8(tY#tpTsoozksfEb7g3yc5f!T(>oM;*=I*vQu@Qkwii!NM z4;TGs&i{2d9GvdI9xnX9JX}N&NalaNVG(e;|9&`lYk!~ppXdH>PbVTGjC-vpCv#it zzuTQqPS$@V{O_*<_O8~p;D!F@{ehQ&JI2Y})7l*cWd2NdTrJ$Stv$^h9Z{ABE?%~F z&OonNq=0mrdsr*EIJ&s2m|LFBma!185SUI;ULo8${yF4d8*x+5;{LDW|J$$sK9Qld zucwzg(7*r|l(UsJP$_VXr?sz=i;FwZLcyRQUKVR7l!ph(+xlN;F#bn|&g2M4k)x}f zxweZHI0=ico`U`@W$=JjE?yRn)<~2UPM1C1y?`n^n>*olu`#!_W;uIgYY)4BUX!ak z$_eEOF7fyA%{@KcQ5IgFxM2W`o-R_|P+eE&%#0W+-&NApHMn_SkVOhiChn$D!0Mdc zw$s@?0D<|}%RGCxxJx;MEq_n#1TK2^GcSvWxs$6S5bU!z4yH^6tl%R9O#3aN-=SWCM&YwR=N(Lh* zyKsSwmg+JE>>3^8^=ott3`}hNoJ=gdtPBiX;@rG~LU1^okyBDuLRf}h1TKs_3Euhh z=gBUR(U6nV2s1M<3;+NAoPK~P&*9nOhZ5kiK=_n+1eAEEpCCqXpG0_PAK(qnK6v;9 zgha$7=gyN}06SD&g7EPO2=ECBh=>RY!QMe&J48rHM8zzmKzv!>oP@;SHRZU$3X?W}QoxAspEUm0< zZ0%6?9-dy_KE8hbVUNQjBBP$5pC%=zq^6}m!{p}W7hnsEieJ91sI024sjYk0-14cl zt-YhOYhZBb>+s08@1s-GGqZE^3%?eZ);Bh{ws&^-_78B+g$EJ*eJt?(KYcDr@Lc$W zgam{nxaY#d_W}P1C<%#}g@~yX^hwO!F0%+fJO@)ueDUVvc~%jFHEIj@e$p#!@G16n z+@qa6+5g^yJ^DX-vVT9=f1Ya;A|t>9lSe=a$wPg4@Z9*R9Q-i#y@5Xbe)S`GB}8hZ zp&!$Se_*iH1FM88$p#Gi@Z;ZcPi!HJ@RX%6+%t=ai$~mhSkeSNf)9m*L~116h>O%* zSauCAyygPf2Ob3k1vM9}-+&#GAWcRhiV-;^cm@x(@$>ORVWi2V2(SYwkqquH1Qp_G z5J`|i2<{KJN#aDG9m)P&QPr<#AI;NJ%F5_*9@XG?V#+@8S1I3*>AS*+7Se5nL7(-} zK`^{4+(HI}YB{8v9SO~wYTm7MY2I4|81#g1*@}7H!`&7h-o&Ptm@n&@SPEhXVT$)V z>Ld%T%0Hi+jQlhubus2@Qc&K0ZLFC=XlQlo5swJs5~Y43GEqMfafvSKYnVPARHm$A z@6N-D+d!9zjzL3Z+qA_UMH8V+EP0|r)U-M0VpZ&s`WPr`P+JWZ5y}c5^~35Bppp+X zAk<-HZ(COI3cL@WP7B$%YouEMiJ`f<@VHLsj5HvwJTw=SUm%(Hdnp<` z{UbyF5N|Z(1p{w`@jG#Lqp1 z42N7#A!@6eYniT>Pa(#ucG(Gh#*JjPSF=d^7CNPWGfVD{nfa|}82XB8)Ai`nox8P~ ze~>+nUTUN=lO1VUh9@~Mqim`Vh&<4mZd=lU`e-lMCvjMM;Q)9A*nDgsNoJtwSN>Nr z(zXr`G51YqW)FCtac7g1^Yb^{@T~YjYgzM7(71h+?cBv1oYN<{S4{_2Oiv-NYZV>A zWgivt_t=Zr3h!0KuTIm)f0~m|_L9{IxL$^eD1f&Zs-G|F(X#(%%HH2ph7k6wNK6zO z3LR1@6s62LM}E`Z1I*xK-0(slp-rx+P*D$b6P3aY79z`9qU^$8x+1c*a)<{QY%)=m z&}3WKE($D@pL4g*<>wF{V7T&g@MHRwA$C4?K8UFxuaxsW#COdu|A-53sB+W@GBV=I zAzDP_KHtv4&*HAk4Q1eNSshfC1IuX)_YkzM%g6^uwn8$7kJA6DL{X~-7yiv+WtEh( ziQ;}@fCkeSev`)>K}DK?BvRwTS1=%bP)r2LAX{;h3PUdDW+Sc>tQ+gc?Y2tQ8l0=B zL67~K@r>Nuypgkaqa^t7cK_X3XX9^83^(HE%mUWs=wk)i{ogl~My;}46|#LNQ5OHx zG-mgNz45E-?a{8uj{80yn3Ou5VY$$PTy(DD(^NF%#Lk@$$D6-TDB$Y z?FQ3o+UPggs0x{~jrhH#OENaD*yd2G!j?6EKhQPoyTh}+{xYtw@E{giyr;6e!Y{>{ zvQrd_PssN&$M4BUYFB<4Zgl$aj*OJhrvs_(EEoBb&b(M#aFCL+s7C`R3zH~ianDUV zd;)z;`j9T-QlcIvb4VqWS@b;kc?<7+QLL6dD}s_PW(b=H$D=&_N?Qz$Vu43wqOhT? z`GrV|i5%iV)O-fwymkRRTLW@}RVG7>sZUdr_KKin41L*SQhsqu$a!`CX&!2Xw{H^uLWC2 zP@xkHEec?GOt{%H%sHSaBsi(!8t_L1pU$1;G6I8b# zG)l5SNipL;FUlBwo$vinLDmX0-pK@r7&ZqU`bKVrMHMXLrS`lJ2r!{IIRo zu)Ckkxd?{5vg7V}lz#H(cphqdo@~Qwqy2WPJ6(2spm8bh6S)^VzU-OWbIrBiclv{Jn zKppcbv{dkcJAyv#1v!H8Hj>=0ym^u)qewMUlve%S6AxRqhG&+HAGeLRDiBezf`6r? zs7DQ01xmW8vmuZnjcs5IVioNzfiZ|0QYpaMhSR#1{IOzfkEY*>z&Al z&+HasLus`OG1d^f7|;xtbvg|%u~1SiV4}(M_E0Ebv~&6qM11T5?;(7&5f{WL%EwfY zLzH6x>?v%?i4T(BL%FE|L(oSME`j8p#u2&U9VB_fz$AZM#0>+97^%M)n$6iy5`l-e= zD0+<}?vAQOG+&*WZ^z8+HHKAj{EkTZ-m$m(RmPBGB=5;g^6RTt{&dFPd3@xyTk_~p z&vcr%IMWx35%gBKLqB$0g)qR9uOm?GX#Go&!{twyt2-VXFRaAxn%EM&^Di-Mom4SQ z?DDgGeG0YPE5sNUUQ=;J2}(WixUKzoa+6|e*GNxcW_7?XoBwjgO@V;nA$(hyk#~Zt!B()~CW{-dwgdw_(ZuPXKlp5J5G%iQq zGw^MEh$mRi)!+o`|FY z&K1tV3cV|`pNDMn<%U`iQ9Ua5N?^ug{xjo9eOXAwo{9(Ot{)G%7|_M^5pv{-a^t*$ zy@&ywdCs{W;Ve`#)a4{GXopuh>Lqx*1Zgl6o3S6}D-E1~!KfJ6HsVk~8~{ z4E69dwF~tiZohoE9uNj8{UbOOLN1lD2jZmWhw7S$i-n{Q3i}9(n=xmT2aJO+aL}^c zkMe235@#gPP=etToXsF?&ew=B%nfCu7A#WM0)7BV`uJ?fRTTc$EyN%zszcdf^-Bz^ zFGnNtTng@X`nVrj#BXx;1z?~L>+@wh{*JfxJKvOr?T7nEjg&87*7-b4r3_T*pb-(z zeSeF0&wcI&DNZ{q*BJUqJ5R$I9t7R!*^ZjczFXaxDAvlt$Q?xOAU&R%l2~u+-nVFr ztP|i$ymIfnV*-UF?P9#flB2+FCs|9ML*>WOk@OWQG7+?^He}hmT zGUR4fz;6D*?xGg)Bh+_l+FJSu;(5s)&eV;?0Y?&?vdL#+!vc@G& z-HeH>>(MbgeB^;s^1u*7?7$8I-wBQ47Ohlh98MrSN*(Fwk z_h8JbPnSNO>;EsKLkvt(L>?S!(Lb|Hv{;NEmJT>xVl-r)(`N^w5QBjb${fNxxIW^% zGE5IYgdCQvho`!>4#L99%486Rhn(wy>ERu*JlBRzAuiw~4+vI<&IujlC4p3y!r2HA zn*aIheRT0d*{T1Ej=lkDjNuc+Wzs|*W*~3LhPk;KAU+JM()c?@w%+94A45%xWQ*%wisVR3KSJ+XokGp;t!S2M zj^>MGB%KFMP1GVC+QPb}12+5)(D$r*Lkmu!vS0GtFaLz&t73aa5)V6jXY*jP51pM+ z{!#Dz9@|Ki8Qj`z`!SmsBWmt|dGNY+Gl%h4#pU*+P4m&ZaaMiLb!ez>Wpnl7DdcGx z=g_A)HW8FNY!O)TIO*Gt`6`#rXFgB2Ao}V-^m#lrkE%%B<_s=R@5gxj?X2>;T062Y z<$2#$@A4Khrr057xF^Io=0ElpFg+|7o0t0$Keb&fnPh`<1; z%Z207f{@GpGJ+Be%m13ie4HaZvy$&2m6>_qC~#LsyQ{*#FjIEl=5G=V6M9V}4`2{)nsR;vpcsh(mPEw&)o*%)x zydbIP+J(3{h|~@&d<)UGGdgEJ?E%PNl7ZnP1%e2I;3#0}fVduhy>$4MDd&8++CP%| z=mjpL@j!@P2>|X@g9lswQYjC0c~UEU=K-6;*Kcbt<*=m%el@W&ikRs1sifnJg900; zP`Ao8<6qJSNpI=y*mAzIPxCPCEi&yq{EjD3Gm`sqBvaYR&DPT@9eyWjU%Fo0%)w~# zQ;6fxZOt*8D+;xv?g}ziBg!uqJ4;5{QeV)`k*tmzA6sO3Xa8~#%^P}M7vnHNE#Mrx zK(sldtA6?A*K4FoAyX@gBh{VqmzEQ69SIa?I4P8pgcA!qS8L7sj9v+$v#BgnM=OwOLUEx{kd@D1QOGY5upeTOgwobp!Fai zQq-YMWZ(P1=K0a37m26PPgXlDp&89U^x>eVWza)6K;%V95M%!;cdnv=w-(u21E;^GGJK;4G zT7EBrYROMTLv=r^(T98*(ac-oSk|ra4%vEC&-SC?3WNBIZmczWWY}s*=q~M|R4bJ^Vk3tIPj#pYo_ZzWF&rfa|J{czL1!13NpT`~$HX z+m|ZgqvO4+BPT}8Q>l%Q-wyFrNz({8u~UtGdC@;I(dfz;u#aArA)juU8b^$dcZ9rM z%}yF6k#FCUT_kO=gG54}P5~^q zXbO55R&(&5tM@RrA};8_l5<0^?IFX3pCc#=kqT#e08%`XaS#E>oW*!d#Y8tjes~rT z7BCtC#dwqpQg&R9!3?s9WaP)9R&F>RQ>%>o*Gn%kjc$7|^brMm8!W6W{ zyY_X`@5{2qy9j0LD`!Uul!`q$g$686A%}=lh`{L4AFYvKbwod0u4$B{qF6@$80Y)+POLJYm@30hwZc_o%l;A9p9Uds8^%Q`0OUUL z)!OCp50V~WM?2M3g}HnaWwNUDT7>~+^zYy(p ze??aFx8AkkKJh;kyOXC-DH3)4I%eheylbJOo==8$Hf-flBd%%+89`L&z+blpO8zx zT1x$n9tCs;F4t)d?2M27y5Z7tM>tOt#nAHLcs6Lq@)1{6)rCpL*HI}3$4@%8dbG2$ zKMBPINw!aoR(lyMRZglh_6$skt$DOf-OYDAg-{f_EeGhz)iR~qmkUFZ2SP5&Eiw+I zUCUTIz?di1tm6~ghnoHjT6#b(PBWT$Naq_?($urbSU;M5BykiAK%kdyyYeXvB{&xp zzQZjS#uCc-Jo6OFL=ND&w^Dr0jPVcCj+6Z&e$4ZS?uJ&F}Bjw{pmjMOram z;;GuN&1gDi64vfFThM7VlSdA3gEaihX!>0 zu!^=A_%kwq#})m;BNrU(5eudNqlN;=0ae04KL!L|02d&RFNNt5*yZgN@xe$Z2eciEmCpyS2hTA0R z{R$P*={s8mnvsvLvw3+8I(Qb(Ihc>jb`SVke4X4C7uP2k^p9Y~^5mafsbySRbzHrA zj1@YCVzsXndy&^Au8JpRvXo}hRIX;UkCj0IzWFZ$rQjDYThL3b#X0_d8JR*mp z;|ncVzc%T)dwk(Z-HKQ#SI!?fC@Et-_w15owGLE5`6KtuDWs~qn}|Mzc;bFONmMS& z3vz5Yit1?Dh9%Hm#c)Q6rZJ8Rt2#%X+`alU_(JATbtCL;1nW-8{zdsm6HL#JjJu3JGI@W!6>i+z5Y>DNeXyImkQHk#gS1$>x@mxLuiqe+U>Y_n zeo&2c%YNI_<=-|DQP(4&7sNC3nNhSPd$RpodHK*CYd34riDwMgy?+aGjb}6P+ZhS^ z=VfRQIw?fZ%KMCFULxwUt&GYrne&tIHL(Cz$<(kEV7m}i3muJc$Cn_ZFXny zCNd5io4xoRbyD=?0(LrzRXy8=SF@+oNEnM}nhGln7IGnMOKjecF|_2}10 z9c7PkA?rEwq8^zc7vQhWi^*~6l@@$c3%F@49WHOuh&kq-e}*{c=QyY>Fn~h<3+YgY z07)OzfhU6ybt^xI0G8dVaEL`iO3K^-$3+9E7N)NXgO<3tU{C|HxH32N>RKTw0Boc( zxhpH7bq#JJpxf&Pq;Xjw`_`qVDGUQH*|(?_WZ(M#8Uo0sHv5wA+DG1Mi~;%j(|Gsg z53Fy|#3^3}c9CxfnKu78TSf@%jFk@#*P7m+zB%X|uNv7IpS@KQzOZIA?d)t@m;7Vm zhdOV2eU1FF`K`&XAfh`zn$niAZ{_gJNPX_k9ic)Y-o z?WqK-6D;99tl#aiPfg_=!?*9J#%*Dw%gNzVk-EV&JjwOy(VUng>ga z+P%2oT^Z6EmzPqnk4GPPNxxA}=ZGaY>(Ic?GwgQ|pF%qyel@=ls$bA~zpQ)s!1>O` z><{_xU+hbNMX#u6svdtv>kf+Q2hrre%gqY$j|%$}){f;~SAC<%*eG3fp5_U@ccE38 z$R?+KE@D0NsPuR#)9un`f*;6PU+EOMA3I8@-Zy2^ z-*PAoFfgVWpQ6YXUS#Gk%4f_W>?6(&I}#Ub^5-wJl>h!Z_4r7fU?G7r?#2k>Tn-Z{ ziFFbD@Em-Mt274|9yAK{}kTuz89Z3HdhfG`=@0h=RYeS)x6Jgy)I`a3?W&&Awu>q|T)Mv;o~J1e^LdE2B?i0^ zHa*JyF!SBrVN6*@|3ST+|HRw+;Pq=YfrrK%39)}V$1uAkJ@i^b7L?r5p5lelF~tl}~Tj zb+xm1RU3!}LzWt8-fh2>u6^d;|Ip&a5y}?w?(*hApUP$0**N?AOxs)`f3j+ex}42> zjfmmb(7Nl_iKK*C9h1o`uuDp+TO6V64@c%NyJx7&hYR7S$T&^LtYEzlHZ^2brw|uo zNuG~*iyX-=MvNzZ2uU02k9*P;ck;nNCekfrItM@a?#yajcDO|B%i_K4w&eO1Xr^Xu z;3=(-<8t=&)2UbKb&u0P#|%C zbaA4|#NfL8#3@7v=`Fa)g~gW|)yxsftbXu4$wR+H(vno$o2-2M75o4%hlF9J%X3wh zJLk$TVT!e(FAAU5XR`7p-wTFDFQ^2Y#L03$CFxQoI`dK=0Yy(fLIX+ZqQld1YTWBUd#?J zdDIQ7hmX{jz&Js$Nqa6hG^#tDi-ySA`IrwYp$N2w5m*PVgkTWEC6OC?B`z6&as~sS ztfYy9=$cxT8Cwt+j^OKBh5i78 z&jDN4CrzM(lIeh_k?)WoGa7ZQTUVI++Rt+M zsNB~5sH07xoHM-e`SU@H_{(g&^v_}m*Lp|Z-%mmg4L;*T+8&<2UCy#`WRkd)L@~iL ze{-LNHO%OpN@m)!XFRhy>-X6Ak{$4}(xMwbI#0gUMDK>P*&SZXW1@SXE{T8F)OW#u z6Z5IAzx+kxt@2Y|}A; zO}~d(O@2p+unL}oXdNAQsHGg}`G%-s@TN8J=d)}22KA1XZ zq*v5_^yc%|&wf(*c=tduoS5b7{=2z~;#5sMI|rnm)|wr7`?atEIaeXXhuD{SO~`Hd zERAAFQ!DdarAIO;o53lw;v=^h6?fxJoeFx?F zwyEQ;#b8Feb$d+ZNdH6+)whoLxtGO+S)VYo0$TmwwS#B{8y-_yp9FCGwW zrKR@b)z)>Dyf6t3wS}GAB2bgtW@pMFg16{!0GN5;Z$d36!KQfRSbTN{t@5o;*8!AmyJ9xgxsfVS!Zy-E)CzY>f{dW z(5!ZgSa9;ZV#YMMnoG|wrrFym(5?5!>B8;0Yjfept6|h}mc}4qZ4ePK@wb$9z`x+j zTv_|(E8-C4z47Hoa`XBg-Lh4~UGuuk<8Kzifu)PBZpic7yYCXzZre>8T=u>-SjE{alnIHOo~7`HXC5`(o)R6_Cn|Y$ z{i_D8)GXm$&cc+x?CCW%9RiG9Dtn~%!)u>-e2^f{7WPN?T6}(&PdU!THKEQdzB^w| zaN%uyrQ&yxIhL5bx^h+9pKnHSg+ujC@#=JjcCFwAs~^$xa`Y@&8ARWQ9NBfrxANPD z^aAF3H>e+?_`c4K8b#Mc40)U7P-c1`l^}ZE3Xalz(;bh$N7u@7EeS7?|LGlP$Zk%P zHs&nnc!6G!5DqMIRX;eG&P+><+hD2>lVr6y(T3z1MS_U#p%r*lt{%2XY)|KYQ2lsV znd9h{DD7h;^-yH%OK{-NA@z)B)dZD!ZCq?JP`N?X8zQ=UBd zjF!B2D2SMF2n0|#oUSvt zp;Tyq9YPx9pbjMa3%DDSiGum3Xb7nch*#MyI=I5(U@=HfD(m)9M0}70GF-eA&=PQ^ znFDiqu3RI4n4x95y=Fc=N_xX`14M5zD7@VK9zf9a; z2Pg)`^CK&kkl(YLm;L9+{ARh^CCcJtDYP*YTwR1+ma-oALN2i?Ke39%55cO1-x-rA zMESSn>MrTfPpvn-)Q^uQN&aXC}s_V|%z*4IXh5Xp~tFKr}#!#kH3)t*{k3~ap`c1>zi2Y~%=d*X7 z|L)NFF+-Fl{{&lBeOdjPjVGp+*AlH;sX!CUHfu#0sgbSK-&TS(eL;U6-+<}3leWds z=ZZzw4mrZcjy2&KtC^r$FZIykZgq|8lhQ{5nSq_8yR38bWwWF6a@po6{=(uh)4<0x z&E8hhBpMZ*5ucva{fSl+*-fBc*nXLJ)AWw%&}#mMZkljT>_|C&seEJ=4P|V_mnP0N z4HK(f*6gl`?LI0YtBSgcNRh<3Jn@XdS%UB*a{ae8=y|W|hAHK9 zgyUSL-^HgGa30u*?IL4RdG9-ewD9|QRA;bX=@e7P}tkhH-7D1vh3J_RMJ?49B~I2~l<#SYK`z=ndn zxblJCExG3R+8aSZ5=bHmPdK1)!TLefiU}|=knO`j&6aT0s{~}L3XaqTJ9q#f{g5gc zsaYl7G$Z9ShSr(+>8Ns)smPPs3!Apo1uuS3{Lauz_uPmidy$6LeIjJ-rFGOZ|LGKp zqz<17p`edt=Qkg+sjf{*xMFg#F*5942( zP>qqf?`YyEV5`+rJk_W{UFIt53fX!h4E@j}(^f*_75xp(607$S)9`3Z70RoL@p?hr zd=Xt)^rujKNy=_n7<+{p(u2#z}Z_TRsJewBx0oV)A~4|{JqD{=rwF% zv3=5bOwFhUMUoGK$1hOM{7JS>ojfy%mBFDUo(`8cRo%rGuF=-6S{c=_6M?{?;hny+ z_zUTSJ^PY>49gr@jA`JTEMJl)0_qaYwua6&QXCz)~zLpoF z5^`@nh2};tZ*9_LZ}zxaGV+{4v|H3{>EX8}29Ki#w>tA!hR2is$mwhz@02iE6$ZQ# zIx30p@W(K)zH83rW%2;f_ht2XcDWGDosS{yRkxaI582oWjuzN^AX{}en=Jk+aj}e* zuZAqdqY|^W*TMth;-{mvjaEu2#dI!phC4pOYYp6m#rp*`vFl48;F*rJXr^YgYpt9@ ze7y5BzmU|L=GQw=5zn>Zq2}9SObg_$p4co z2NC3044^UtqlW!n*spe&Iqi^1gn5Wta$_{g*3c4 zxIulmG8wolu6&>*_ooZ;0cjze3yb`PH?*XngQKHj(XRg>>NzBXtvI@*1hNfwn%xg?gj8x{G+x?FdN>rI{E$^Xgo<@hN96U$M3~B^nTAM?%s)iRuU__Hd;TLc%YkU7{!L?+BuicGWGV@C9j?qmGRg4R zNl3zHEKW$P@0_;9OlR-v&wT=x;=q9pq~B)aeB0#4La2!5)DiX#x17x+*M2}ooLY|o z^Qtb^L99B>XU(KTzh^M>x9oAN!xN|Zs7@z0h9cMC+dT$-D|~at%gT&V7(7yRjBU9p92W5b6b-|4Q3XR`#SI2ZYV`TQ)S65c7Hg&PTEo$3& zf2()b$+vW}jlB20(Gs#2`-__)>{$5clU3b11_8k6_2fv$fnPY;$1PH5i^+vUX#fq3 z!O$j@_6%x<2DL$C2Zxfoyx2j)qe;eYmPJ}eaZA%_SbfMbBGji0@pLpt5aW?ycO{r;W9+pK=So}R=4tsQ%#LZDTS z_3f}gR@Z4ws^F2B33 z?xn4s`ev=JT{pv)^#--_SN&c+Xes?7dtG5))J0ixEX(gD<)V)dCgr&2mEwK=X@!bl z3QkGdVzMTiWF-%VR6xscztw7(GTx{B{T`-RU?6|r&Q>|QwfTCJ=W9GQxwkW-{tYVir-284a{nL!9Pvw>r`a>3&uY3vW z^H1=l;L2`UBE3f6o8+`h8|7@iKnLi;Y1qW@7&JcSqmx_Uw`#o+{uQGXE@zxy|M3@h zyPHs^@u$nFKC(gDhV|K~fk1=uC>-$E(ml{_fahZkhJqmP$36#s06Q=MKrxgX&Lw=zO$Gyf&1H4OdDSTm zlpOE`9sv5%S6$afKsY()0wEN)vKVMru**#ih3RqS1ORsAO*t9gs;?e`FI&1NHe34kzn;mQCDk=A?d2?Ht1k8`TRFln$qDMn&zPYA(%036ENZUIHEJ?ODBJO z$|n|{LKSG#^<>gk!-gTx?)7POvhHEYaJzy?YZVs654mu`iBHx z4j7MVecSjfu$2ANu1^$h(5=?k`8HM47G%`gDMyAwoLWPyx_;ZAcwYis*x`j}rTlHE_--raFadTg-#U zRTp^-2jPb)!l+$gfYu4D^uhZt;+kQ%9meWj&4b$Nq2affGLKD6l}A7j zX?E53m7n-))vBT#VIK6xCQRwPO{k37@m_vyJ6-15%0vcYniJ7kyJ>V8yT&MSJih0kV68y8ImOumfVA;G*xJYt3p$E^;Au@;)#7=u}- zFM_hr48fvV-daWr<8q*~7vrnjA)ONqhb^P96V?%@%6f}CU*sDSL*_Cq|A+?NK-m(7 zCtpc@6IJ?Cfx+&5vH`@B$5P0W4%$Xg5m>Mex(;ZIql!9m&T0QcB*y|arw!;fXfXgB zPXg|UEI=Kg0o@}YAF*ba0$~$(;da4JJ{-y#GU&(g35b*X@PRh?_Yv3uE#Lyd5wQ9N z2YonqfTxoW3+Mw3VFjJ}P*O8)c^q5@8m&NDfpYCaY4X6aDlEKyyq|NjBIMoMe4tan3HxfQ|;TP z{@@@_k{j5WYtJE|>Cp5%grpn^j!IIG6$|WqwRhim?eKE(VucdOy;2u9Tep7z{#HAq z*nm*w){Xnde&)%K;=hTuG2+S2y; zIsD$dQJZJ_nvQ@DbH)+5tN6~yJEy*?#+s~wko^VM@bm2qw&hbAE!vbxo3nFf+4GSm z>eaV;*UL9patU`^IlFp}G!bp@pT8>o6ah$#4)cI|aCNZ!fr~K7WZb&wy^q22tOhDK z1DW@WhT!C^_iG2s3ZB|^|IvGVNV>##q~PFgm>(wNX43tG#AULL@p!c1)O6W)v-Muhh(K7ryLsQ+m;Y@r^mAS zUfh(2huZ$)9-ZsjA8whoT3(V6RXiCTK5;O&q*J~+$$SU$AB@|*EKp5$MN<8a*x@ia!YP|DU#(JC- z6WabUv?;)WRDg?&eTE>zB74M#L+Q0aLmDcF5OmCdzOBZs8SNbWq*6W@G|H7X3c`Mn zP;;ZW03d9{1#0Uvf0UVVOwXqe0ksV~a6Ak`nIP`UDFi9^P`}Pu8;uhVpHkya1}zVa zM!v9*pbJn2aE|{{Wd3P+GDrt44;1(XU@Pc=0=Q}O66 zvW^3vv6VC+vw=qeg=9AtkMz+>+S#;0!{(35vV)`xMsfK~>L;-n(dx^U>hU^t|%3;U>ZO&ixPrH4+(wJK6y0%lHwM_&(}!i8^D z9FD;CShZ^K5Eh3+I^gFpAQtI{xi4_U_1psLbGW^^r}Kz$ZQ=UONlM9blhE-%zu&Q4_Sc?D&TQpdW1KJ zZi2zh`CJZg6&8CIa1~Y#T#p3hWqmrpzNIq!Fe$lhSy%YGehK&c Ve_aRr{_7J8y7zG(-10x`{}0Xim(>6O literal 0 HcmV?d00001 diff --git a/assets/logo_build/location.glb b/assets/logo_build/location.glb new file mode 100644 index 0000000000000000000000000000000000000000..8757f20c4b26e1a1f59cb6268cc6d3f76c9d04c4 GIT binary patch literal 3328 zcmd5ad4sXS++Z(ux~@ zfh%|Z0&s;B5>o#HS0oNx(DID!Y>c~c6S`8dWP9wHcb<11KkxgF$3cJpmV)D+qP+E* zqI}rvc4mb7K1-5VB*Z(Kk->B{V&WlZPl%_hWN?&H+8e2nXWt>y=9x4(NrzFp{ZJ9;ZE(Ks;A}(p4Re%rC!gEUc-;I0%|Qk z3)JWH5pbU#`nnp=d*78U_$1s{?328>gEMkJDu^=8f zqyEX42@@wwyr(rlE+QZ8gvZD;#K7}8mU)%l%IPl4Z54^g$NMZAr^m!=X^Zdl%-9z4 zVtFv)Go@lIGp1>|j#+0~#PS?Rm+~&z8a1|Vq3XFUzG2z44p!GHxJJe2I$Yf-)bd|| z&5F}&0Xr3<*IBVsar#+c$SM~{A&k=J*Ih%Zj)!#2^4^e#EH8oi+jl0>7;;;v3o4N& zAx)X!sEJu^oeabSmeL^L{$V^FA4jOW#6$I?3EPQ-SnN|j)AErlN@jLud95&-cSGAM z5%U>JZy|6N@+9FWZ2tBL)lF8oqRP==a!en@Llke)J=psAlRdaSjHiQu_4u$V zF$kcPog#8(WDV~dZWDOmIJ>;$B?Phm>Dmjh4EWx{soUzy_y4oC{nuRhZrixH*8gAu zpOY*aSaMth&_wW%r_gC088l4=A52sEI3ow$Uc2A!cCdkjqIopr*r8^5H_Vg^_0I!K z#u>D^%pO^AVUOgR+hgChum{9)d%J9pBzcW}mMfRxH_P_Oeb?BV=Z_>e5muIS5rU;6 zeIzuT1Snxy_CWU8=K=Bw@!Y0N!cPR9^uQ7JW!N^zr+)DyCro_Q#*DPAmCrFp!Nvna z5ZUQe6tD$WZV^v~FOA{b#>U2v_+{8`ca(1qI`7}R^X47-2hsju_YimaJ8|o_y#D>$ zw+U{qw|BStx1ai_fBydK<>loYI4}SD!&kbm-u>v8FMfU(LzMPjXZQQ<$6w3#)9(&` jQWR@jw&n2(&hopw-9rDx+spf<{lyR0_dhP?zqtDkO3?om literal 0 HcmV?d00001 diff --git a/src/misc/settings.ts b/src/misc/settings.ts index 737b918..32a5790 100644 --- a/src/misc/settings.ts +++ b/src/misc/settings.ts @@ -2,11 +2,15 @@ export const settings = { preloadModels: [ // @ts-ignore - // new URL('../../assets/fox.glb', import.meta.url).href, + new URL('../../assets/fox.glb', import.meta.url).href, // @ts-ignore - // new URL('../../assets/logo.glb', import.meta.url).href, + new URL('../../assets/logo_build/base.glb', import.meta.url).href, + // @ts-ignore + new URL('../../assets/logo_build/location.glb', import.meta.url).href, + // @ts-ignore + new URL('../../assets/logo_build/img.jpg.glb', import.meta.url).href, // Websocket URLs automatically listen for new models from the python backend - "ws://192.168.1.132:32323/" + // "ws://192.168.1.132:32323/" ], displayLoadingEveryMs: 1000, /* How often to display partially loaded models */ checkServerEveryMs: 100, /* How often to check for a new server */ diff --git a/yacv_server/__init__.py b/yacv_server/__init__.py index 7037103..9ce7175 100644 --- a/yacv_server/__init__.py +++ b/yacv_server/__init__.py @@ -27,13 +27,9 @@ def _get_app() -> web.Application: """Required by aiohttp-devtools""" logging.basicConfig(level=logging.DEBUG) from logo import build_logo - from build123d import Axis - logo = build_logo() + logo, img_location, img_path = build_logo() server.show_cad(logo, 'Logo') - img_location = logo.faces().group_by(Axis.X)[0].face().center_location # Avoid overlapping: - img_location.position = Vector(img_location.position.X - 1e-2, img_location.position.Y, img_location.position.Z) server.show_cad(img_location, 'Location') - img_path = os.path.join(os.path.dirname(__file__), '..', 'assets', 'img.jpg') server.show_image(img_path, img_location, 20) return server.app diff --git a/yacv_server/logo.py b/yacv_server/logo.py index f79a605..5e9870e 100644 --- a/yacv_server/logo.py +++ b/yacv_server/logo.py @@ -1,11 +1,14 @@ import asyncio import logging import os +from typing import Tuple from build123d import * +ASSETS_DIR = os.getenv('ASSETS_DIR', os.path.join(os.path.dirname(__file__), '..', 'assets')) -def build_logo(text: bool = True) -> Part: + +def build_logo(text: bool = True) -> Tuple[Part, Location, str]: """Builds the CAD part of the logo""" with BuildPart(Plane.XY.offset(50)) as logo_obj: Box(22, 40, 30) @@ -18,29 +21,38 @@ def build_logo(text: bool = True) -> Part: Text('Yet Another\nCAD Viewer', 7, font_path='/usr/share/fonts/TTF/OpenSans-Regular.ttf') extrude(amount=1) - return logo_obj.part + logo_img_location = logo_obj.faces().group_by(Axis.X)[0].face().center_location # Avoid overlapping: + logo_img_location.position = Vector(logo_img_location.position.X - 4e-2, logo_img_location.position.Y, + logo_img_location.position.Z) + logo_img_path = os.path.join(ASSETS_DIR, 'img.jpg') + return logo_obj.part, logo_img_location, logo_img_path if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG) - # Start an offline "server" to export the CAD part of the logo in a way compatible with the frontend + # Start an offline server to export the CAD part of the logo in a way compatible with the frontend + # If this is not set, the server will auto-start on import and show_* calls will provide live updates os.environ['YACV_DISABLE_SERVER'] = '1' - from yacv_server import show_object, server - - ASSETS_DIR = os.getenv('ASSETS_DIR', os.path.join(os.path.dirname(__file__), '..', 'assets')) + from yacv_server import show, show_image # Add the CAD part of the logo to the server - obj = build_logo() - # DEBUG: Shape(obj).export_stl(os.path.join(ASSETS_DIR, 'logo.stl')) - show_object(obj, 'logo') - - # Save the complete logo to a single GLB file - with open(os.path.join(ASSETS_DIR, 'logo.glb'), 'wb') as f: - async def writer(): - f.write(await server.export('logo')) + logo, img_location, img_path = build_logo() + show(logo, 'base') + show(img_location, 'location') + show_image(img_path, img_location, 20) - asyncio.run(writer()) + async def exporter(): + # We need access to the actual server object for advanced features like exporting to file + from yacv_server import server + for name in server.shown_object_names(): + print(f'Exporting {name} to GLB...') + with open(os.path.join(ASSETS_DIR, 'logo_build', f'{name}.glb'), 'wb') as f: + f.write(await server.export(name)) - print('Logo saved to', os.path.join(ASSETS_DIR, 'logo.glb')) + + # Save the complete logo to multiple GLB files (async required) + asyncio.run(exporter()) + + print('Logo saved!') diff --git a/yacv_server/pubsub.py b/yacv_server/pubsub.py index 24c77e4..bf478ea 100644 --- a/yacv_server/pubsub.py +++ b/yacv_server/pubsub.py @@ -58,3 +58,7 @@ class BufferedPubSub(Generic[T]): yield v finally: # When aclose() is called await self._unsubscribe(q) + + def buffer(self) -> List[T]: + """Returns a shallow copy of the list of buffered events""" + return self._buffer[:] \ No newline at end of file diff --git a/yacv_server/server.py b/yacv_server/server.py index b90e9cf..23727fe 100644 --- a/yacv_server/server.py +++ b/yacv_server/server.py @@ -243,23 +243,25 @@ class Server: response.headers['Content-Disposition'] = f'attachment; filename="{request.match_info["name"]}.glb"' return response + def shown_object_names(self) -> list[str]: + """Returns the names of all objects that have been shown""" + return list([obj.name for obj in self.show_events.buffer()]) + async def export(self, name: str) -> bytes: """Export the given previously-shown object to a single GLB file, building it if necessary.""" start = time.time() + # Check that the object to build exists and grab it if it does found = False obj: Optional[TopoDS_Shape] = None kwargs: Optional[Dict[str, any]] = None - subscription = self.show_events.subscribe(include_future=False) - try: - async for data in subscription: - if data.name == name: - obj = data.obj - kwargs = data.kwargs - found = True # Required because obj could be None - break - finally: - await subscription.aclose() + subscription = self.show_events.buffer() + for data in subscription: + if data.name == name: + obj = data.obj + kwargs = data.kwargs + found = True # Required because obj could be None + break if not found: raise web.HTTPNotFound(text=f'No object named {name} was previously shown')