From 1817bd75b420ac9236b15647e955deb0114e9a4a Mon Sep 17 00:00:00 2001 From: BenjaminV_sl <60651082+Bvallon-sl@users.noreply.github.com> Date: Wed, 5 Jul 2023 10:37:12 +0200 Subject: [PATCH] update to 4.0.5 (#26) --- Content/ZED/Levels/L_BodyTrackingSingle.umap | Bin 42639 -> 42639 bytes Content/ZED/Levels/L_Passthrough.umap | Bin 41734 -> 41770 bytes .../Private/Core/StereolabsCameraProxy.cpp | 9 +- .../Public/Core/StereolabsBaseTypes.h | 44 +- .../Public/Core/StereolabsCoreGlobals.h | 9 +- .../ThirdParty/sl_zed_c/bin/sl_zed_c.dll | Bin 155648 -> 151040 bytes .../sl_zed_c/include/sl/c_api/types_c.h | 38 +- .../ZED/Private/Core/AnimNode_ZEDPose.cpp | 8 +- .../Source/ZED/Public/Core/AnimNode_ZEDPose.h | 419 +++++++++--------- .../ZED/Public/Utilities/ZEDFunctionLibrary.h | 6 + 10 files changed, 296 insertions(+), 237 deletions(-) diff --git a/Content/ZED/Levels/L_BodyTrackingSingle.umap b/Content/ZED/Levels/L_BodyTrackingSingle.umap index 4313a04dc861f30cee836797bddb5997adc426e6..14a2df31fc274ea60297121f2b4c9791346328a0 100644 GIT binary patch delta 80 zcmV-W0I&a#%>s|j0S$TC@KFBvuVKE-*ALFgY$TGcGhX mvoKhS9}o#`M5*xvOi!TMz)WcKH^P$vi4>Dyb2hUSczZ7H7#^Jf delta 80 zcmV-W0I&a#%>s|j0Dyb2hUSczZ7G)*h+= diff --git a/Content/ZED/Levels/L_Passthrough.umap b/Content/ZED/Levels/L_Passthrough.umap index 65c84c4c73fc3d218410e46f8ed250b64463a5ec..a6a9a744f2b402c97116959e1977f286c7b6739b 100644 GIT binary patch delta 669 zcmZoW#+`Vyd?gMih#xs*;E#et}POi0xXHrXmX`Ezf!z7tF z+0HVKX-U%Lht+D6k62nT1tx=;DpnRubJM}h79jIlI!xE(2Ua#r!5MI_gS8FQ?@XX| zYLk~(TQFtjfSD{d7EHHt;ffM$Y?vDI;M@a1u3A2vt6*!x)R+&}*J5kIG!Y^504TE% z!F8~+VY*lh*S7%3bu58#C)wLD@t01vvyWq{D}xD6K45Rds5|+ueLU0BDySgKK-`QFuhs?<8F3ve8I@X;5=E&S&o$l7(G>+eVu=c@tWxwSn3)Y=ouR6 r8JTVljruGs@b;=>Y4o+rZvA2%eb0O9RVFK@SxgpS656~dFU14^=w-<5 delta 437 zcmZ2=jH&Gy(*_Sl#;nPnjC!0QObiS_#85xEfl(*$f(`?NJdn4;l!3t#NQ3whjt~_m zoER8x0Pz@fQ0m|7KxTZLwUfu-iA-1j;j)dQRL~kwLV*83kQD{A1*qlP=0c`^W1zzr&Egr)Oinb5XZjg6d19*E zCp%ilGhUy(5JGetFloat( + Section, + TEXT("GrabComputeCappingFPS"), + GrabComputeCappingFPS, + *Path + ); } FORCEINLINE void Save(const FString& Path) const @@ -2577,6 +2591,13 @@ struct STEREOLABS_API FSlInitParameters bLoop, *Path ); + + GConfig->SetFloat( + Section, + TEXT("GrabComputeCappingFPS"), + GrabComputeCappingFPS, + *Path + ); } /** Input type used in the ZED SDK */ @@ -2694,6 +2715,17 @@ struct STEREOLABS_API FSlInitParameters /** Verbose file path */ UPROPERTY(EditAnywhere, BlueprintReadWrite) FString VerboseFilePath; + + /** + Define a computation upper limit to the grab frequency. + This can be useful to get a known constant fixed rate or limit the computation load while keeping a short exposure time by setting a high camera capture framerate. + \n The value should be inferior to the InitParameters::camera_fps and strictly positive. It has no effect when reading an SVO file. + \n This is an upper limit and won't make a difference if the computation is slower than the desired compute capping fps. + \note Internally the grab function always tries to get the latest available image while respecting the desired fps as much as possible. + default is 0. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite) + float GrabComputeCappingFPS; }; /* @@ -3014,12 +3046,12 @@ struct STEREOLABS_API FSlBodyTrackingParameters bEnableTracking(true), bEnableSegmentation(false), DetectionModel(ESlBodyTrackingModel::BTM_HumanBodyMedium), + bEnableBodyFitting(true), + BodyFormat(ESlBodyFormat::BF_BODY_38), + BodySelection(ESlBodyKeypointsSelection::BKS_FULL), MaxRange(-1.0f), PredictionTimeout_s(0.2f), - bAllowReducedPrecisionInference(false), - BodySelection(ESlBodyKeypointsSelection::BKS_FULL), - BodyFormat(ESlBodyFormat::BF_BODY_38), - bEnableBodyFitting(true) + bAllowReducedPrecisionInference(false) {} }; diff --git a/Plugins/Stereolabs/Source/Stereolabs/Public/Core/StereolabsCoreGlobals.h b/Plugins/Stereolabs/Source/Stereolabs/Public/Core/StereolabsCoreGlobals.h index 9199af19..c608d907 100644 --- a/Plugins/Stereolabs/Source/Stereolabs/Public/Core/StereolabsCoreGlobals.h +++ b/Plugins/Stereolabs/Source/Stereolabs/Public/Core/StereolabsCoreGlobals.h @@ -1829,10 +1829,10 @@ namespace sl { NbKP = 38; } - else if (BodyFormat == ESlBodyFormat::BF_BODY_70) + /*else if (BodyFormat == ESlBodyFormat::BF_BODY_70) { NbKP = 70; - } + }*/ for (int i = 0; i < NbKP; i++) { @@ -2126,6 +2126,7 @@ namespace sl InitParameters.sdk_gpu_id = FMath::FloorToInt(UnrealData.GPUID); InitParameters.sdk_verbose = UnrealData.bVerbose; InitParameters.sdk_verbose_log_file = TCHAR_TO_UTF8(*UnrealData.VerboseFilePath); + InitParameters.grab_compute_capping_fps = UnrealData.GrabComputeCappingFPS; if (UnrealData.InputType == ESlInputType::IT_SVO) { InitParameters.input.setFromSVOFile(TCHAR_TO_UTF8(*UnrealData.SvoPath)); @@ -2400,14 +2401,14 @@ namespace sl case SL_BODY_TRACKING_MODEL_HUMAN_BODY_FAST: m_out = SL_AI_MODELS_HUMAN_BODY_38_FAST_DETECTION; break; } } - else if (body_format == SL_BODY_FORMAT_BODY_70) + /*else if (body_format == SL_BODY_FORMAT_BODY_70) { switch (m_in) { case SL_BODY_TRACKING_MODEL_HUMAN_BODY_ACCURATE: m_out = SL_AI_MODELS_HUMAN_BODY_70_ACCURATE_DETECTION; break; case SL_BODY_TRACKING_MODEL_HUMAN_BODY_MEDIUM: m_out = SL_AI_MODELS_HUMAN_BODY_70_MEDIUM_DETECTION; break; case SL_BODY_TRACKING_MODEL_HUMAN_BODY_FAST: m_out = SL_AI_MODELS_HUMAN_BODY_70_FAST_DETECTION; break; } - } + }*/ else { switch (m_in) { diff --git a/Plugins/Stereolabs/Source/ThirdParty/sl_zed_c/bin/sl_zed_c.dll b/Plugins/Stereolabs/Source/ThirdParty/sl_zed_c/bin/sl_zed_c.dll index 6fdb6c79378c19862a858135cf50abf51683f3c9..03381c6d4cc2e0e76c964e3c2bb148696d313784 100644 GIT binary patch delta 61078 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 CaUnqf delta 65488 zcma%k30zdw_xRk$s)7T`u*vSQD}tb)fP%6N0)png;+mBUCYI(h@CDTIIWAr8*`~Ir zxm%WLW?`CQqT-TER$`Vu!UeTlDxLp1_r76fl=}br+=Pqw3eWyif zRg2{*#Cb((Z+*uVho`;J_)&`aU(urElyQ)+7q_L(WzVgtW7u;`>Wl2TDRmk=Ll$jH zodVCkUB{)o1kY>YCWe2ZaZ^gz9n5cI`D@}wsgoFfa0-8JX8HavjGF{?#;2&1{|Ylz zs__dPRa27R9B+m-szQQV39W-wZxEHLmO}?Dp}j~r*-2j{UAq)D5S53IN>ySnsO*78 zwOmlu;j>s!P4+gkf#*6wRe|VliOO$9u!sL)qKbfg;US_*LwfUnJBg~a<%(cm8YDP( z{c$Cr+yI5u+nY)FGf1T>ig|hbn36Fn)#48U1|?M+;Q1CECHQu&Y6-7Jf=UJdtI{yB z{FkOuRmBwZqD)8-R^%av z*X`B%LP4dAKcq8MXsdwZMD;X>OWTQR?`ocL{TVV7)%px=5TaB&ST0W+3pv-$JeQ$O zL)-u}t`Knx%(x=NeZ;xsX^RoJ7;))peeaKe^E8Kdlx*%E2CPm$())rMs)y%~?(mfF z6%$qZ9+XIDa0uuJ0viWtgW%m4-^FU3aWzN!y8}SZ`X2!b*MUZO82s-;1Lct=@GdT4 zP1MEL$g^iczU&ZKh+Z}PV4nEnbGot{h0q~7(cymICXHZEqxi?RfkwP}#`P9tEE)+i zw~TAVtSzn)GmdM-jAI(9R&aW*lJ9u7LR$*0#3~zzrpxRLvp!R#HDrGF(#&@Q6j`Y6<0NGB@)P8p{Q~NOl`A&y- z&^j}B(0W(whO$FNz>-e?zOCMQpw75eyY7j}1Y@EI<_s7U@8l|dQfcmzmp5aV02XDN z2^mY5Y~(qmOE#HtY1pPqW*qC1{4GkkBE(JO>e4HH@*dA-mLl#`p2=U1)g4hV>k#vu zg4v0f;|itj5GfZiAj&m)yMJiUO$k;)8sYX@&~ z&`Zn;(KrkabI>>xD|{8-xfL>`|5O0TGv+e$8^#D-k1Zl9dGS=VLZjITH^OY96W`Gm z3wq!Q)(E9X9;{*i>B?_Jd;xi!)R*@Gc9UNOVx#LHz(-epD5Ab6@ZzK_Ri<;)3YhLS zonpF{d2!!HD+l)#WGuE@w~_b1V!UlWQjn~l6L>C9%Q||Z8OM5h5ocqbPY|bgI4~+D zXFZqNIJh$}SR9<*;T343S)VWCyS0aV0TmE7hbh2e5j+h3eG!xj^MbX98;bg69_|?j zcP_h0BiOZQ30pQaIXL|^*AtMls6=IM88iGgW_59mm~mVqW*pPVM`j!|{>?mRac~zo zz%s#J-~heV49hianPI~?z|xbUW(xBV&>{d8&pcdLCC43{&WvLY?lr8g83#AA$-|{j zvhr|qb1a=Q3*W6h+%y2lD`&G#xw?RL$^ZmyfnkE3f@($wcVsgCTpgj$YSO=XHf^=u z%E7gUj79xvJf|3BFEfs*zr>7V>c3{jG4(rhbt(qghv%63xr2LwQ(N?3%>fnKbue(y zD6Vreuu{L7NtHtJt(k{e{T{rC#lgiRpvl2~hV&K(_kd-=`!NUSvw=Cdnyek1C-%bs$HC3bQ2M0F!S(;Z%E1kUjHOE! z@|@Bo1~ZOz$v!iVbxFq$m2#|03b?w=4z7%6GfPp~D|v=HxQz;C9bz^sn4OSu-KJow z5VKRk)FNh=f~iByZUxhbn7s-{g_sc^SUb2KTw3nn-d766Vxjd)p)@S?k%B2i%oYVx zgqZCLrWi3F^Gs!_VjfDq$-yaki-R*0?BoTS7*r_?`f>4^9NY??udGw>A1nAqo_CE? z@G50mo37x^4vv-oKRGzncq<3jKGR}_f%tCi;5-2!KZolHgTKHCUFVd8gM0CLw8AC_ zw-6?i|BHhw1Vfbb#sRU>^+Vvp99$sq`d0^cI9)N_3T>65m$%nhIk+{DvDj|aIvWRf z*NkNS?C~BWRUBLv&t+&?Pfy~M=J^D1O%85^lKWQ&w`;7mgWHaSO&Qgj@!i_Ny@v{L z#Pyod^)p<_8T=O@$RFkfYX{d2_1nCI+nv^=ku=2;#I@EAZad^GDyic+WjNn8A+jdOf~dyRugRARjDd`t4uJ^gA3uKft)Lc4hZ*V)*~KvJt6@ z@|#>)=Xb1JSr^DyZ2x(lQ*8eQGmiDh+h!cIeOKr}R;~!={Z3ptW>+?bXERF?SHd&g zl`T{->kzY8!R$nDVN@_xh*_>+Y7s*fOdVq0P%w>%c~ilt5R>wbo{7ZQYRkB^+?D-L zDHMx^DwRTMSZI-gDMXB@V2Tj4RKXM@W(ChQxiTf+s+7a%C$Nd?PnDS9b-kQYNr|3f}C>So!~xE2|q}<;q&&$W*M*3E!<<*^?e%a`Cuu zF!=ut?=aY-=YuQjQ-oI7)r2l6) zr-!a(^e3O9H;mA_=?r;V=Rt$h2k6rWr4I%cv3cSzI`K~YCBPQv964-)|I~q{ph{Ja z>2R+kzs@rs=tQC$r?c0IbK@d(m8SVEbCRFTcgTr;(jdf}^28@PLka9Dig|H5UFFdd zCm=T!Ixp9Wt##wl?aSxJy1|}t=c26^cBKkBw)|0ANi+%*rV|}eI`!@WaYL98Ce4<` zL{+;WvWwD{(+p zKa?M{M`bB=x+58JxV^1vXsr`Vv_&GI^2E8Q5GI$-?nGvMm3YRa2?H+6*MDhP8=p zp9NLtiAQt>#~ksT&M@B%t;mjOTPA!i#2k4HXUypznEgYMoMv z9Crt*AT0`^KYOhpk7==YoW@}Sbb_(3eV*9cIY0VHj(A?aJD%?LP7+>zjy8HnIp2j? zu159?rXfB#!k_)=6ra(8)R&&{dAVEKb6~=tX`&M^e$tW|sogP?W&-$G_3m1o2=8U+ zbMd8=y&ME(1`R(*yZPn`i9vLs?=YcVAie5qj4T0vi^kbH&!`K}DZf&eV@QA4;APVE zhJrP^%1b4!fRCJCNZ)KX+Gzl6=G4efsHxq`$bJP%Nu6<4xUT$qoz9TWN(O;HvXqP} zpkMk8x6l03WTN>2?VLQ}9HK_9qN)CGM7sC=7Z!Ce`YkMe&!_+RPj>nhj$3NvrF2?A zb%$+v*uH8exvsnl>aT`+vL&(PzT}B2s$n3^$u72{Cl|_u(`s7W%cdtLpuid5dI!crv$$c*&55CdUeK0Amnc# zWF}M6Pp?_G@Oln41*Zy8!)cF@7dw3D0q00^U)Vyckyo?#UhI7dd+*BLOWAvr7d;!I z4aBJ-L%f?O)|)gBL3PX14`&8}dF4mw3`?|b)T@0|?E9Gj&o}O04YYZNFSTy4L6&I< zPd}1v?+D`Z?vaaybVd;Z4VdGXu=N7gqA)`VT>cLg%YWK=LFz9v03T-t=iKkE40L))d@+b@D zA1e7Od>WT9dO5T=_Fp6Bfj(U&YZ%}m0#)L2aI4&t3}Ru zz9BDQ0OLxQgJPx7c)5oQbUBg?L6Q~eSO#(*VXi!#eiY^x_vs)e(FF&UD*kl(o}J!+ zT8A+4-G@+fj<{bH1uag#ToQtI|9UTaKdgNhXVgmBA+!)SnU2Ki)Vxuu_*L_Ka#1IK z1Fm=5e3~Ba(cVC6ALl|+7$>slI{k|0(81F zfTqr;)#2g7<9WzaNF7L>A|ix4y=h#8S6BuR;+CyWYymD*U3o~!=ZWbsqxW+Lczt6% zof_dM2x__{;(g(6FS0b}{EK3Pq#MkWa% zJ*j`x^Fi-`PUEX|1}B)NoZ%nTFhZMz^Wx}(CQa1K^us7g_$`g5ck>fwOsB)6V}%W= z)EGTJs8ia1mE2!U-8-xcn%48bh#pS^qVB@f6zbY>e9(>_|3#ZRjjrezuAk5yCJ6Y? z(m7=ZYN0dbJV3yZEP@_ovwD59LdlzMO~1|#=>0f-A-=ou_d4Wb&)?b5M(kQKB9h-O+KxDNH=;UCdNl{24RgN z8(Hn(;2Pd*ag^z4>rR=%@f13+(_o<_g>LT@*y?LWn_DbrwV)R|C5>@QL0g+M1pXDl zzezB~q{+`aA(Pw)`DgyZdNY>wW_>PzOq$BcTz}>Ui5GQc2UcUHUnZggb9G#M+Y{;Z zSZ&xM1{B%wo6FxDk+_(@z(=4pfEt1xA=Dqtpg z3??IoCeYT2Q-y>C9Ie8U@l;BjDC~-7xvcTjJ1JP$b&)0~^%Jxl`1v@xF=@3hy)zq& zrm=K%H}94+p*!Wz;(#|D)6KKxaftHdRZZD#SkWAF)`?|@$I+j=MG8~mXp8Rt9$m+x zSe2(sTy)}h(DM=XDRH!W_iS>HI(H9n`*I9JA1!IYaNp9M-P1`qqTKUrQ3GRXaB{L> z=(uZCaw8F>Xj+*1sa;(wfjaew5`<_P-(y1F5E$V)ae%fkM?9e$cQDUrpO$l=PLR_8 zZnW2@8=Q>x!_y7++W1Qi4*OsvE6QsTMN}}S!U;ef4sSRCcrlLt+M~1GiIxKO>DiIo zq}e@Z+_eE`52dwVV8pQ(C^|Fwvx`De#cr?gPJJuL*+UW5C}uJvsIdiE>fNuN$9OLKEmio`Y=5{IDk_pT2c3~qIQU+dA)*(OsDpW z>9`H#2hKr^Cmn{ea-MGi0#<5THU$hnC|1i$Bk0jyL2cRt5g2{xY;Ul4ohfwqF#2~d z-_{>$k-nDkxi^xw@7+V_If0Jr9V#SEpo@D42!D*En|n_d;=`$TMslluLy`O>EHCcT zQ5l^`HC>vK8gOMC3Xq=&fq@3!<4@}h#m?%;V%enmX#}m$2y}c znPI}KBWQMJx~G;G{~U|sd;DpWCSn9#lUXPX52cNnk#5fo#tN39)}ZQ$P#T%lnfygZ zWc6yd1sYIUrLH{5Y)4Z7MvCJvRu+Qk-mIWVJ5V7kvCbnfO+FoD4np#@Me;e8V~A}* zRLG8rcn4LfsG|{Fya<62SF8in1EB~MGil}zqeHT_EK}c zS5B-D9ZWm)2^J(1E$EY~ZRd|@h{y6L$(P`L`H>85Auv}R&d}-zDznWfy0cHTS0v~N z1k5j$mm(PxRi5Ba@Am1`{zYU0vKPx;;VoV5=7?QUjQbgoK#_s|G$S`!7~w~!=Nd?7 z`gd+8r_<2a^1fIamzS(>gf$L?C&%REK%&a5FyZV0D$P%lbK4>7rOco|4`5dLvd%cL z76mqG3NcJVeV#CB<_02VeeHYtjUu_765V?7?81 zHsrNxH>f@EDmxSeKHIz;9zGH+JS%{@=LZUB3ux#3Tw!dxUHbgLi7>&3&Mmm;_Xn^< z`*;!fusU2J_{7@WP7g(39I zLLZj`SbDLJSq+@76o&iw0B6zJuuKc<2%T}&P7pjtJT42~G`OFKz7Cim_6EeQsQ6gK z9Ydhb-mt9E8u}T70_`8x&^HwZb=JTNGlO5Pp;OHaWCdEB(*bH54`66I)Xf|DohKLR zp}8yv@A9N|{XBi&Myw8`P_gz5(57+pGEeH(U*kKAp+R(KTXc~p?b+W`uVZKz!!kEB z8r%D&Qlp18a3cZ>?G2K*HFO1oIvXTEYv>#Xbumam3KTrcarq^HLT}}1hvYG56a5`M z+kcflL4z%DNjLO$!B&I(U}J#@bWS(GO4JN;VRZIDXKw*M@L4zIiQQM(392<$Zy*L2+^PkH|XnV8BcHzzggv-H^|0E(ivq+!0~U1~H=zH$(>X=7a`OXAKn?6ln9T zq1W1Q21(YyQ?%zGP0Bt*fz60%3^#BgR`>}3nb`$Fs}{;WO7X&`;s~{CLzfTI=x?|y z42IZXuOJxMj|zinHGx4mcSV}X4A=*+M*{R8qy>|t z#n!af7}VK7ORS-_4C-Q_vlM6&a;TzH2k%lZgk2?drvtCH!HN2nLK-_{ireU$6XI*fLG!}yO$<_S5 z4p&rP^7mp~QSIFIWSB4MQVAgJG@J-=yg>IG@m-#b2$=Q6PoKv0ccJ+sy#10G0d&=u zPZP9pp=BeydOvEVa5(fd!DWVlTB{kx*a#2#T1%YcA)Yj1^D&&9(Ux8s(Np;D2K5{1 z7n1_&Mkfm!RBccJtDzOJt0r#+ZwI^Fmn^Vj^6Ef3ab$o{+k4l7kt>B{3jKjQ6v$X! zpk!)MJF}Hc5vpf0W_Uy!i!&F9@Q@BH>LLuQr%Q_B^{di2n_3_ihuF(MJMw%f7Cxn9 z+%R)U$*coAkUxhEa(zcziqnC(L|cqc;GUue24#m9LH6JtsL=))XoX~}E81gBTVb6O zeQr$BxL6Q%c?N7gvsn*=*6dWMrBUg^CEAZrr8l5vwHw@SR=Yc4`>Rl#>keG%MVR?P z$v}{$l8-AH8Ov7DTVsOTOxewrkFauND@b`o3mQDOtuVI*?K(C&Gy@5rI0HZ4FFr6* z;;Yo|c53(DZtxH4?Hx;{vF)70D_{T$soBQ*K+ zAC}^2tay4y(CP&=tw~q_f<>nm0Lfo%DCnT*8ben42X!g=BYMR>sKwb(0E0;J-)ZtZ zguyr}&{_c}-J{Vn{d~qE4&x^-m653fgt|$KW~K_+XX)CRiP7)gWxH+0GLMz&7$fm`H4~yYfvC$c-PH=H&A31 zD3U3R^=DC2LEcZ_(643(1)aQUrJ!#hV^#^X=Uunxli8hzS3*%#Oq$x=k*RgEQi`>9 zG|xaFHW1z#95V0_4-AiS=)r1*4633F;M4I)&KRpqvENYfHLcL)B>nicNOF{3dM!{N z6^3J45d%l>hfoTJEekedv4Lsw3IxHZ<-w)`oXddDO0XHkDW?F?GRI=s0wlAHYRmS> zMVMZ6WpwtO4B_+J^y@hZf=?*@b546<_6_PgH%J(FgQmD^NxF!%sT9{tt?Z%nzhd28WS3+Z)vNs!E*V8yhrY(6wTxA3F?I^V$5YDEQG!c2BLu5%YP`hyNVji z|443wFL1go8td%g4V>572D+mnS@`P^y-^YBu^I4YkDLb9Wzrn*p`n#qQ)_-n^l zI>0wVy?YS^dd$tRz}7REvjKL%o9I^jva9ui@9et$$aYM4^!PB9^(?!AB7gZ4>rb|U zzLUM@$I2V|%R_n1Pt<*JP>}#NG;;=&M*LqN5Dgac|tplY_@|& z{!FJWP9Ue~hl>-1Zf)pKizfhuJSH*#X_gD0UI9BkvOgk@0P(OjCrm{&T zK9n!fnM*>1^&a%iCGCY$5Bk*-|E{wc1>cUE zd@r;e(4qhGuEL7Fbl~z{zUyJhFQ+BK;;O3tAsfS*(+KLANIza4=n{Ay2EVg7*hN;K zr#~()5>}m~Jyv)M^Ul#hE24V#I|mhHr$AkX^6{`KsotHPwy1m(ZtAXRiJiGb8{`a6 zsP?^|;aPSl39`6r1!sZU#fO30UL5u2tR?!tJ^XRG9+a~^Y78x%K z0s)~5n`owf6f9o31^p4v+OEU4^Y+Hd z`_Cxtt%4V&y|MD!kYQz@(Vo!g)4)Ui42m-YtcL}ON?eE*YJg=)rg$Px{1&JVA=NUV z60__L3(rQdYCvbGtU-(;(@UoMbMWo8a^)GiXl0Slqtngl(}B}4{1#T0p(Ji&-DNgU@qU30Zey&5eGb+)Cd~?5GQxy`VaH8-G#A&y+lk6h zz7uHW?I-A&cRKc{0ED>cA$U=PSR9IFjkS=Gzx|HAv)FPke`l_C8-HI114MrBJKE#j zcDiWBLIqQxK`gOiG1-bmkrj&pRxEV*jspH{N9cR+MvvNK2lC(s*kmhC{~Wal)5zbM zFu(G5Cd>tR&k$MLz-WiUN)Vb-jPvr%Na*hr09Lf1QEQ@H_CTK1*%Rt4TI1^@fHmS4 zz&g}j*`ZQ+uzm4+l&(n%*$%-A92LdE(lt%Jo1a2``ve8z2OBGE=*>009`k{W4b!F* zqQ4*0c56F?j{w1ztKFRN#2^SAB_ud@k^qj~1DP~=_)$7_t!D=(YgiO!fIf{0yN&S3 z7=kv`eWz-=bM5HZmDOy*M}7u;RZb?%_2k#e69LSs0XMt2n)Y1h;}vfO8jSD8{5rX7 zHJ!FjGpubBu1-#5?`-u2i=rXUkQCZO0{gi*ss4Dx%(+fh0Vymx>R{1<;sM84c`D$Q zWm>6x<_P_HU0n8!!%SY-;XTCPj8)j0&mn_Njb%;shF}=O-~1qX4X46&C{>EW;`A^b z^xn{xNlP8sKHkhrbnkmz+Z!>?1|K>K)TSPM3C0?T>UtSwH59kdr1{iD+q|D8RQyec zy}yh+pufMLEqrx|#(yxOoeQ=UPMwyc>=4wu>Wt5oBC`(YohJ{-8j(*XwFoL~9;0x~^Jn5y6I_az2 zQPgs9)+#YWus2k6KV$=O21vCH#04NV98v|P(nWh!x}hRzR%^zHgECaGPhF8T*A@nw z?G;I-082N)ot*w|`NlMA*p%f}1Y+fs9jSrAo>O)cbGou4aQ1L*la{d}+4Cqmhk^K?f0lBBn?xDPJJVuSx>Eb!KbqFQk z9f;z9NS@45;(3!MvI(4QfgaY=Muw-2?eLG+Sfd|QWaUNF#?Lj&Nv zu$ZJ92Wp8N_7%)14jGHa<6YHqoV?jxQxV&lF5b+EuBKP|woN*mo_tQ7_YKU_O9!Kx z#XoglZ`sWLi<-DRUvvR;hYOo|vCcWsM_EJp;HGgqyhFalbAFxCrA*eILjJ6pJiNgR zA#iLEl%%`1boTh6)&{9VBz?4{vwo!o0We2rU9^iM>Wb;}*exve7ij0`-|%({)YhcM zBV(Bs;e67h5g8q7@ycY>)k}~!x45Y(tOfZ-m)M->7D^4L{-QrjYuUD!(LO3i%n8ac zb|}n=&H>4f(3iIsOzW2;rccU=PA}3Ocxab5t_oT=3sjdgt_B(n9qUo86PK`l$QgHp z>EP9qO%>^M%UckSJ2M@TK*|8cb6A6$|0w|k%+ zVAr$q3{y(e;a;UI?4|af#JQ^PgTydTC7Cq#w`s3W3Y>=5g&Fr+4ixfec&s!XqN}6p)+@73GU;{gd z8r)Mb4qU{pQ4f-7^{4e@4gKV^QRENmzT1l!cSY{LVCRyoEXtS5(~GI=7cs8EdYlw; z=i;QGp}H^hk*aNIOE6sy>*p6^m*@O4V6A#KOXyX@sgU~9IiA=|8@~#LwV`Hzw#PhxV}IQ{l>wnyc_WK+P3Sgm-g=|7>Y$;&FQWt1z%S&#!y=+}VgEY~Ia7#bw}TK&|Y( ziBA7|uy+~9;{8}_?0s7Ib!NtCK!O)l4?e9Pd=!-zB<})Ho>2*6(hycC9|aim@fgFk zujA73&!Ob+=?hhn^nU>!`T^+!mG33ea>P6N;zRb;#6|QW>WV+XVw${%3>lMV1H}B; zGiM;DgwA+f0_&iF!sQ8~s{jpdKEvRc2hkf&+nENtJn>WQI`#_FT_>Gb;H(=JecUn` z-~@Q!FFU-U%G^e6hR9E3(!~Sm$)}Y0`T=r4yWPrTf_>(>1SY#En66!-bo6KnsQ!WHArn51WF@2>GuMS$|Z^XW#`#2COnC zn5pu#5%MO48#QHvuq5pGI0K)<<>;=72x@I`VY?~H(m&5QLJK|SH9RRtdIId)yzYJgrk_eq(dx zu?FrucB`PFM}`Os&r^RsI-=XSVwmlXS%h6P{$6L8;f8U6 zVUD+)zY7Hd2fz*%M_}|>0*;^@Z}Q4pr_nY?lZ4LMH1BA*|JJogs$5dmi8;>rsZPr; zVnN*c>2&$gToOuuJQ^T;a*F7tsRp1++?78mSJsL?g`GW7ly`cq9V380b3XTv_u z2glo!C-lg1e=>spc07^%O8rl?Z$0@qI+0gi#Ob>3dD{0xw6O0rI_E^F_g0vrV9u_C z7RY1XYMMS$=$;ez-MrpJq_R{=lLP2iC%xQ%kvK4x&!u*&>9vztWGL-e8%N%yqielA z7sD953s>wHKsb%eYhi%ObEvV_ha}UDwVj9;JzrZ+*3#jp{E3#%KIIqu1~BEj8~h&d z?x*tS=|W5IS-F`VOE8kXWmr!ek@6%6Ta^(ygP%w z`F)`8$_-qmSUDGJ1OJl?%O+Ui$RE+u--m_U0T60fPz9QTWhLGP3zGkModdc008mc@ z&v}xqwClMjVx(ivO(rMliE|l3$jj8@e6;>2cauq6S=ONus3#&FK1r46QTFE3Jo{mGd3yEy+a57ch~46u4NYu_Ktu$6{lYtBD(!U9 z-?I~hM+@QK6gc@>56`~v@17bu;$QZirXD`1TtPM8JMnJd;UaJ&J!Q@i}lh2&N^vutZ?ny7g z;uSZ4GGp(;{g>e5)b(>LG;8g+2q15&#N5>`D$11Utc3Zw?6~rn=~>$(1PNj zAoP{_#zqzW>9-M0y8^A=puMl@pcPB58KDb&uW#_RF9&)E9%6Bc@2)dSZp^P%%kS*^ z;d&V^@<%i*f<=AMjSlL`(AM5!Moar%hKklp5QfYB;Wt8Xxv#&mlrQ%eRzRN_7O>_1 zLeMz8v*rFm=vjD&<$nClgfV=%pFN4M^*i&mKFh*FzcXLxvn;IgJM&e3cA>JwkL62z z%=7hqEMMPq050xhOIy?Gn^}Rlgval(YN6_!vO_it`@^uX?|3UlnBJX^ycO#4Rv!%F zS3(M(!Lf8vANt0vNMYtMdf-+b%$2QgpCzN{)!Q-J=p2j`E}-7h@(gpeg?WbY+9CNE zNuqxMD|cN&yEG1R3WgZ8MxI7rZyZPZ(ff_jsqJ*uMPX%yD<3EdCJ(_}wQO3fQe`bl ziAUQ5w>wum#7(E}4eu~{ZKk8{q&m4nq+BD9rtjbB4*ue&JH9ZC9^MIRy%NK5c}*5J zV|5k{yBpNu)*$m(fneoM4#t>wbRt{<%XgDscm>GIdy<*0Shk41d^a}W2Y(y@*TYUg^-ON?Iu1Qq!m~p#8zjG@WP><%Kg+_oJ7@|D@SDL^@*>*n zUT3nO&b-%K^9MxBFsHoACz<>t9JICc_`MYJ1#S69VnKz%F%3Bu%Hj-OADh(D|6_-6JcFkH8SC-=0ly!#%FgU8}^bi|{M!aYwaKI#o|)X7Jl!kka&^+#zWnnwJU>~Xsc8^rFW4P71& zYZ=YGkLjy_WkPtk|F0QBo`!b*dxUVygD(GjkFfGx+UK9H@ugF70*5=-4QpUMa>OuC z%n(o32mOP4AZ`%P)tEHh0F#5GAiooKX z=fO@JQ=rQu2s~%D=NilaN>rYjE3adFy5fnyyQeMG6hgm#GSGQavdPpSbgq&{je-cO zhbc5>Qy<1!C)z_F`8~oapmY2b)-Q3^Efv-wbcM+?)ZZ5B7y{!PS6p~fgo|^K{{0kb z-7w-Q6;C6rX`{)9>|5261PbwMS4ER9DO+>E5|j$9YRiAornauZj4!Z59Vs7U1+RLC zWRPR4u8_994^G5TEE9sJfe&CrJIS>GV4f`B3BG?mJPFtt2VTdOG9Zru60?|5yQ$Rf znGfVGQX(NsVshZr>|fRUE3&bu_jsUmhY)}F-L~Mhfl{DAf`rH2rF4PxkC_dT*1xj! zur2#IfU~^zyiH9f0~kw^D!JK_IQ{D&f7954udbdNU0bt2r{yV+*btkU&-<@H;i%>P zmlR-vJ1J}hR4rcuQ`iaHCT7(hY{DFP8iPbql^ux@0@aqb29UnIq*?UiZmvl1WMEF!8qn;GTxE?wuK!3h4=jlQlkU$aItV3 zrEpU_5TA%&Gn%!r$_X}tPxX@u9f)V(C|hv0pJIB)BK zE+VaTan6?PYfgrPNe0-c zQDy;{B>7ji^}ly#q9OiS2M&+d|v+EBzqRV}pw6%O>HjLo{sQG+()?51BnFP3hX$xNOE%~${LrF_% zMhj9HlamHt9sQdd__fH)kwsOWWUJXs2FMe;|jhHJ!3UJvG5 z;GihK^0Zk4@d_`+ZTSJOJh8UHE;Iggo}q1e>1!~TJa0vBXG?!WBb{zVGD)W7?Lw0D zU&7t$X3T8lD4TxH(y%^b^AvnV3&**FIdq|^Q$w21|J)U;fE#TW_;B9Uw z)?snhAC9nTtFbL}*7Izk6Wg*@aAyriWYA1GB+cTirRA-m4MUUv!+ZTP+@=jbwUMs0 zCOzEO+k%(2kz&;(#JOb}HX@!!9MW7hn8%Fn(%Whh=-yH(p*WFy?kKSK>M)yT)WGHj z7#Pm-6LsqOaMV~WM@SBCB(FyUXgdDVUV8|!@SeGb1haNM1^PUxj<)@8+}vMbDG_wcf1NzzRy+kS#lmI=CZFc&lw>rKY828WC!DXJ}L zC$vwJvfGl7Fgq*&w_?nV%T>x~vCO&8SeeU-(z3S1SNJ+n+R~N;gnf``Tc%+UuZNX+ zg_qGMO1H7h=tQZN2MO=k9m+JL%Q;F>rb|a&RGlb|_5fY}+*MlQLE=1ibOpoQ{R4b4 z)FkB}(kTzpR#?RJ3!}SAtu&;wN2g~gOQe1ppmgpkP1FG8~2~wCBG$JrT%Jm{K zVfW%~xhFqo)enb1X53H4OKZJ=`;K@CJ}&i3UWH}Mon6;zr+iaZ~_=*Fpr~k z(rRFI#9>Ih)W(}6M+E{tU3`cWXp{QJDSUE}&#j%T;s>3jSG`G3-6x$1jB41l{Fw#b zHUsP}z~#Uy!*+cA*pEw@*%0d4y@!w*rw2dBw~G2lQN_- zA5hhWIOz=^(nWYTPCD*GLOZ+`*IZ3s7FyMmy@SbJ7$*hzLQO$&QXgN^Eo?*q(6IfA zxAK%XSPjd8eIdgRX7Pw0}B0XwHIz{{n9|@VgCd#g?Z!59+mL^VhkP7{X=b%vvID$7R8>)lN z`F{yRH}QHIfw^u=kSZb;3! zN$vJkG&Gd|ISsZUI_^=Pu}c};h|Ll0pCBWD-fLmDjMVnh4u8@mq7IG2qL8C@CR2{V z{s}+th1Nls7i-eI^*_lafE2iY#&(@8Uj)QSlLJV0)KHKi2R=~}e}Agdhq*S~uL#ml z0i<0@jV<^yfme#H>NXnm0A`z}GcIQzCal*13%*r{C;8i@gh0}XESAOxlA%ID6k9>+ zZuPOL=RC0}6E}U$y??}(Y$qp!3w|P8@2i$$Q>40yq@C0)hGB~ed?K5c# z=1Cv7ht>D|VA6)nmHN35&m4c-GLBZPQ>|Fv$8NCL$z{_MoEvz@;HlGB^QFdM65I1e zc(ZCV+7^FBDQ+G<%3RTNzBD?7guSqkGqE<`4z>(5jDh_V7T6C#IlFT+w^!(t1>Maj zASWsw#sZrpng%LNO?7jmTOp)f%YzVP!Qq61sX}Voo^%(!4wDMn6YoAFvu)a(g}jvc zu(OqFy4sQjaxy$6RMeh72i4xGpaXp5)Xbc8JjH?IGIzR<6Ivr66H+oq8lU<20NchkJ zUU*fS5>DC|%!RMMo9Rh^+e#g+D$T;4jO8|ZzZaJ+fP0(EkEF}tq@VuB;AWZ5Q>c|i z)5J%XmZVvk#~@p>o}7$*PB;K>IzYevjg1oF|E3*4#Zf`L6f|1e5kUfkp25uabAC#< z(cj^RmRhZ6oZYr$YdINy?aQas`H50&B#G5;4QjS+`L@NoTGe7bn}#W5%517evZrU$ z-xJxKi14QN)qjsb$V!(ZNwD6fc_Fr?*);Wy2bQK<3$Z{UQ-qj?WKRq6T2eDYOh6zC z!L|&RM-jKe$?$!AGxpfDsO6)sdVg8In&785Z+qJI2whHrqp!gcQzEX@mbg={>k{66$ITzJHfB z4bI*zrzUN3rP5Bs2Tx5}z0nDFN^bk|;b%;?VfhL#%e*xrG!4{Nn~ycxlE1>qpV`rysE{dkS%73u z56@wErv20asn5)jE=Izi>&xTS-AuBP?%ZulBdmwPVTDYoZU>S*UES}^RrfuwPQMj? z*2Zj3R?~RCZS`IMrTQ@2>ebCv-yKf)pJ{C<0@;k%nIv?4>V})mYxNC?T%Is*LC;@dQYFqEs^>K z;W8HsS;A${8_l=ZQ6W>>d%K~T_P*6zdnYIp+lxfs@=nb+Z z>&eM1?s{oHbJs8yRs<8zUN_@yxSspn!qs|>df1k12PZ>qCrCbtu)px76dVFd8EH$G zWyQ{VXmwS{6r}_r+0#Z4)xR0r*7TP)bte(5vTpmaUoAbbq2409wJ&``Au|Vn^@=a8 zhQ5D#@ZfI7L}^MA3AFpjjY!LqNU-qEMCp?xve3P>6VUS;>F`~_5&41CryJSg_4ydK zm3vGU;t&r%w1ptTE1?OO1grCrt``YQ^V z5~7d(O&Xm-`bo>fiPx~l9c@@#`_;mtFE%ED&!6WMvJgIhevM?Tf8>mGxV{NJZwbSh zrsNJ%a4N|rA4+i%#IsGNZ8b5!K9R;a5lx=}1+J`cofzML*{bTEuk?R&N0tzQrIJ+P zaw{H*&F^5-tmm&dSZrT&BnCfH>>iQV%GShVxNdGn^Sb=FZqEH8 z$vsHY8&S|fMg^q=5wHAW5yRT>CMsl#;T8NM1tt?uZ#*)5*6e1Fmfr12+Dq%8f)O{P zY}$G5ilu@=?7l8s#KQ_%doJP*B;(!ZF$hkDc2_;ye}4~@;?qc4%$x8L>c2)?2?}2& z{Pe#fy_W{zr(g?isFTj5k+IHB1FcR3rP1j`8)I<(5ANDX-Z+K3Yn}9QI`MCFKf(rl z`SKGfNPx)AI7lMBNSby~I80NP|LR|{&1c3RtE1+mdg+mq`EgB0-w6Foa(!QNu+O@fa>Lhu7CialJ|37QGM!4x+QPs5i+a zb<)}1q*r&x^-oNhVnx~3;Y5{hcOczVCy#26gtfW@zYFl?2JGt}lyjRvc4knLRG2{m zyLvZa?9CVl4l-x&hj4bMem6sY4Uzg~khapE4B|1!87giE|6<@@U-&l${uRT&|G_`R z;X6Jps;a3meN$fnT$@066BxeffUn!eorVA;qW(uIB$IR{Tcn|xWH1>jeVj=K5ogIc zi$s!7rOsI-fmBM*XTdF}ED0|4z|Ajw_)2ZE$%~|?G%uTkySrP}0AGyMZ<0RCCSAyE zsUaIWFhz>dk#IL(Y+U)FB=}SUX|6~UbVN(Ok>JOdyAz}Itqw|zl>XL{FybPG_f7XhX*!Q*`$E_8v$18 zsHurRUBA;B0(%kw`ap8Zg^k=?DKVGyil9$`k1+v$K;8w;^qOwEB_MmSEH(ZLPPOcR zPI@mFPDjq^qzk#Er|>7N&hkjEFeyu#m`75afA7WCCic?h0ut=T1OlhC0#14GUD`Jc z&LJL4raai&+vd+XE7QyyXDzdU^=!AmmTVd)gMbNk|Jk1L$U?l(lt@aXJBh^8U1LlC z>das(x_MB9d3tyzqy-ZKT|GQgZJPEAcmM!TOU@&;BI7Rm;K5 z+To6ZNeUW3f~0r*lXj5<9srMLZRk%gn^ydMLWw3$C~zg3`1}Mk11^bJ`Oqfosqa4Q zKck7X=U}J7a34Q~{+ElZTBS0xcRC?`{2YmM|Had$*~gAc_nspm&U!eS!Vl7P$yI>1$sNvj~z?Wp;PAL zMC97cK47>lnHwi-iavwJ;rca5`gsVf(bQ(%+udz6D^)kod!a2^F(+%{U24sHTB9O& zYuiE(jx^8vx|@v%wVbSpcb&pJU>L}K^0rDUY)`y&Q)~+jvf^#MsL!$`>%_?{i~1hY z+F_)JT_-c!<7yjOb|1EgY|VCqE!i?oW?|c!vt4$JYa%Dcmfq`M*gDygHGa!#2e!&# z+2vl+<>91T#2+_7%4g@XRjqA=pZ~3tHi85MO;o^9JX$Y6uIxOEudI4X^GA?C*dAUp zg7k^dHqZK7R~y#b4@qt#!KJTJz>%Ew!b4KxNaEje9iB-b_j6Luk#G)ImM+a4NqWW% zxq)N+0=o^E0$-xI+_8#h?z!+PluMvL9+Z9=Nz&rqw*`v_L3*(ohSX7=K@C61l(uNH zHVBX8W4~yj!p{q)r%3}xLD)320r)+uBu|B(GMG%?NMDa4zWRn%HVr)c4O6|&xQP7- z{riB0<neOzawejmib>cu(aWPr zWYP5B5epY*?cw5V)5V3hO)S|A^3Q=Mcthbn+W;=GqHAbrZXKgLtI(N`HD#)j{vJ&x z#cZl)lW_CbH8T_@iihfWKw42mVzV#75l&OI#IM|WSSC$Hs`Lpm{sy+dYh*X1hMlHj+-X`XJpsl-{dFmHEJ+tOT$d(|CCM=_ zT>lSGXYb6bQ*?0iE9ul&@DAsoF;*ee*I!Adv7}e4RwJK^LMD$RexyP=&=>YFLX|R# zC zm}WZgiWPxIeW?i4SAi=6C4MO_oIqX}?$!-QOXFDDo~0U=I0p))W$AF1j%4X*mX2ZR zIF?Re>GP24O`$Ka%u6ht!qRChozBu3ES<^HS6MonrE^${hXhB#de3gs7V=z0J})kXruiR)ZS9vwRZ* zN0`&$uWcQZ&5`GIwnqjZZU1d5ag@)4FRGC{Lcm{BkIoGo5dI8={I=xy5((*1`in|6 z^H%37wkfugG(0flM}zkV&Q9|CP^iI2&W1cVS#Mq;{z+LU*=P!yn0nInJ~EZ!*&zB3RtqgI_E;V$!Th zlwKPUSDnbH6c*@b8HEr1b$_lDmWE5FJ-0DH!&YSDWAm z4;(fD0bEc21Rj{hXK%>wgXdv~N=OOQBmCjCz2IV0@++((L8;z(;(tBOlAopcK|pIm0@0&eE!Yy^mE@x>DR ziqkV)V@PvwzT~}O`R!t*X&tu>z@D90w-2aBa@1J-BS`Lv;PJ@pq9Djyd zH0;L}jjk)urD*0vA~}9~J5vJ{9%8_WO~4X8wDBZk2|x9cg>a+hGS9=O6DCbOf+|fV z8g#PovvH~4{R9Am!!dX?1i)@IZXq5`H})eYjn)f^4Gy!A1jx0}`LX|)OchlnK2Wzm zN?I$eC?+BLbRdCGdn15QbnU?CkCr%^Gz2-I5ptzsLyfK;jQAW7iw+qVfWYWV03>SS z5m9Au=mbE6-2@0SLWe*l=}n)dhz=fr>TR$G>6T(;Y~y>93ictaEBN$Bl;)KPNjIHD z=)Z(qI{(oz(W6>)*m)lE279!@7XZb0z_y(~@Z*0RPjo0lIJCG8&~)K65kT@w9DqgF zXn>eB--okIfCaq|AWg#oV%K;;i5L4LBmWHX0QAIPm!OQ%^(sD4bl|xRc^X~o00ftT zInQH|fquY0(OiTOqw4{y67#~P^q1kfNUuj29?ET{sV|cZ{U?yCs8Ux{W3P03XfiFn z0KXTKmi9R*Pd)wv0M(V>LVCnuKV)#Y%N0NbU0EP+bcWn8OyDmMLT#FfT&4ne$gj6x zBQ{bF=Hx+ukKy>Wv4Ecp_#+OJS_4-BxWX4gFiPH#dd?ue+N(^a5*Uw%*%v+%u6Mh<+SNFP+5y89yVotY@dL+$d5PJq1# zNqOiRfa7>P301_OPFsBP|Fw6f;ZaoC|G&5Bgb)%4kU-cw7%(79*fb!J4uS+k2@nt! zhDH(v*&+l%M(u#8tQr@*is%GHML;JYirZ*F6vjaf4x&HTps0yB5*$!e#{560>UPp` z#<%}h_Vaw}d+xdC?n_lypX#ctLi*u@wjbU4g|6&x+7;?Sy*|Jw)R4bZ{tn}{Lu+`4 z#G>I0%)Sho$qI_)@6ywyFODbHB(>^g?kLn(Ctc!2^44Y9fZa#dOM04L3w7rX&1||x zYbR+Q8BRZ*D7P8jcWtKhG+7JvtoY&!$a|&xe%1cH%nJ*3yT()hB)y8SL}jL_Sg2<- z{pDQ-yK{ABO;ett_~Ko2`3*Xwd98&UEvT9}2 zDWt3)Uh@}b+j%Jw@CndOVLKW+=brt8XHyS4Mm zBc^l_zfN73Vh%6TDRCp@YI*IY)ip_TQjA`#lbuUaOxwl$a^R$x$&2wZDm7~tb35vB zzbRd;JH{{cdz}!dNt*9BA1~JZLw!Xh|3KCUp(ZKO4IX&0kx!L{SI3!-n8+LA+14{& zXr;vN6grkv!xv<}z15Y~vFttO#gl}x`DrDC9c$(hDNN*B%VG%sgaP9|PSh)-UOVhs zhVX=68MU9N{ZS92l5+P)86@fC{ZSjO^gN3~WzQ-j$M^>&>3*M(KKD6W800F7OsBg3>o&VVbRN%>L71xs!8hI z(ez)!Pcq+kFteBF)KT}njpa*yHhtFP!Sj$Vd~IQ2_O1EJG7QNzN$0!y3{TEpIXs~z zX%fE*@s}07Mb7nP{td|skM3YTT%rernn`}#G04vTv7CkkHl3Rb)3lp+$ z9sEmgDz=cF{2_9AUOEOFUXn_auK0jJP3N8MW!ED-l5o{mVzD;rQe^M?=H5%B%`vH! zUvV=X!3n4D9@X15s(bc+ZTop#&1SD1JOeu3+`IiDXOW6?%`1P_=d_k@1w;?}P4s3r zx+RzDKU2w?&hjH!P3KSDV+`F=)492O+~sN>caI;q$DQu+uzNh>9v^Uzv95ibdu-w! zv)yAK_b5M|)pTy@9y8qIKshFL9^?jwxW|Bd9NN)rzDW<6@nRSE)F4*@e6rWB^3zXM z!=B*+G$MR>rwy;nO--1>SyES9gbD&d2#XY#GfJmP}P#(H;|VTRXzOs1;}6jRmJ{(dij&Vs+`}C z=k4x3T2N|E-lAKEs%~Q?+ZM=s-K!SXh0CNXk8Q7=Pqu~bKdIMre#sxX2qJnwZjx5b z;ojZv^uPxaAJ3>0AF8vd>%uc)@RVl|5x;iT4C(vAaD~>cN|tb5IJ|n5{O7qlr*c>- z&e~OF65d=F=D+nRrY>9{@rA!1&XM@s$7`!qLO4{FTbIB!7*-d~kOZl9 z35q40XnT-`%E(m>s|#04h5FTn)5U&QxFgrDa?|_j@-L!%RduQ^fnO4&)b&U}!p-W! zIa1)}I(vB;NY%+>wLR!oXn9?H&>h*jaEYYPs|zRS5Q^M7MX4l+Xi-24h-gu@WRO~C zFFnSP?X{=3RnlU@tHNQwG+@FPwG|9XIAVxOLQ`V0UtPFD>{IK) zMPi>=7Y<7Nu_sKo<+@#$QLK7r3>+Nm0l z@bqxCSG(O*<$JU?-nD=IXl*}NNUd_~P7^^%zp*a8Yrn3}ei9RrX5m|Jm#hqI)%D>7 z;ZyO&wefz5&#kj}yJ_D=wefBN_tnK0$iz83yf$9K?l|Y5W1I^@o+7=fhVStZ$(ihy<{CDl6ADn-r8GN+M&JXz1n0q)+P&K5-u&Y*EC(JTgOMFx^b`6v3u@I&84(P zwaLznNG3AvA#X>&7?l9Ym>E#s86fCUb5H8D%{t9-{ZEU!&Pp&Co96mEs7{^ku7dcM7ry} zbh*b9q`U#O={iQF6ZyZ}|6m#If9Nwi@4WW^rbg>l(GWM|7qIi%|Gz5qa72YR+J^kX zeZ+&6BWu%*iKx(+J?1Yf7)NRlZojt4R=dgm@6&K`f5k>VGTHuG=JnfSWp(MEEOYxU z)YeTmvo_u3*vLoHiTvN~pZO~7|Hmh`{o(IC>3zBAX#cFFz?pMKV8!4a$OHZyQ+NSy z^{S~Ea8XRt<$UGjm3s}Eb{&@L=Z-Kp5~lboA0$@(-T5hryu6H;kdo0Hn^9}YpiD;iZP!E{deuCF8ugDxAZg=lBcu$53a~*20RGQ`H zmd}j$^v5ihTi#{)e#=WNUt@Wk>yLoB_F6t-xx(@?%i)SV@SE^vxo+gM%5vE59vfb7`OV+NKcC~c<*Pg! zkvi7PXowA0T6V1dhz$p9c(Ua}%gZdUvHXDLaD@tN`f&K^9Jwrr_~h8h5mr6d#fv{? zx!bv3xX|(e%L!?oevsugmOl>byL$1fEFZ939kRmt-8_TkmbY6zV!7RUUi=M~H(Nez z`MU02{9(%zdwAh3md{!a_Vo1IEr*U+;Rnmfy*z_qmgidDV!2bg7k}3B#l5}o63go? z@3UNKxk(?-F5U7dk3;GPt9ab4QYX8wI=6@xOoh}cAr|76E}Z)Yz&ae&7wEN`*=o#lQ5z4+ypk64bo(9`#` zoM(BNu+0AhR*^c$Gt9AkljVb!yASr_7h67J`De>rhIsL#Ezh_7h~>{Mr)GL~LD*e? zo2}vl%l?4P$a10OH!PpBd`*^TS82KBP%nI?<@+rkvE1(>Fa93O)fd_IpFYfsxYP2t zmPZZu^tW5CusrZ$Pk*1~a?9ODc>3j*Kee2g?dfM&e%W%u$dDIt@ko!?TmH`Sr!74F zcXn>HvvXpX)vvc)VEH;bSJEwip6aDvX1SB)vU5EBO(83Eu*@HEyL-x8bH?jP7d(UpNno^s12mX}$++H!{hUWUVLINeUZHkN;F?!{MH-e>tf%X2M{hTZkw-70== z<|RB}d5z^<%Ndq^mMarH`!_6?SYBp1&vLfqG|LH=@5^vTxMOvush5!(;81;+mir#H zTzan;F8>XO?Rib~s0Vb<$<-~Do6g_LY%UgR~)YjvK4ju1ojm7DyZT>gN_N73gEZk9$hc&!Rsp@wjNYxBwQ&og4u_V7c)F)flA)61dP} z5G)uBB!eLqnXn*Wkp)ZqP>YLT!7%gGBl_OhEq1I+Za1U;qTh&3&v)F(S)Om&l<27q zf{r(*;)-7MCPgtUvnfx!ykTJtPwc?a^5g)9@TAP7ZZPgG$mesCTElO4XKF8l&G1_I|0U+wgLdZ1M7w8^@|LBD*sY zvJ`QE?82YO>?DuyCmF#ha*F!V{{iGeSmypuOZhL!WmNAi<4MK zh53sMQ}bqus+iT8Fqa2GUEQ3yqAMXy0QPjDIdfCf)7^}M_;h*7#VYU!GbuV8zR{g! zs+3BJ%}n;NX{oaA6m!~LWIfZ2k6{lHua|O4qQco-WtT za7BHcYgde}Kze1q^a`0V&t>eraB8mP&*?**(zUwzqGQENuY|&eH_V$|I7j+f7O^a5 zo57MLOY*L!XSus%yKH{p^wg1AZiQm%>8^Auln|-Q_3V=C={!3&2!3j${XGk3FOd9G zU4<7;CCtv@jS=ywS9*!k(Q!6aJr{eeE%-*OYHYo5>SDB!@GS zFt%c_X|#o(JN*p*0FdyORw*Q`7p5Dd@}gB~rc!?gVVlTs>-G&)W8FsiD0TL2T9uK9 zr|VX$3+S+}d#x@k%NrFHApx@`m1NOw_=J7ngSt^BRj4aF^-DqSFB2JQ0fp^j+IRLy0F=~T@MM#z?~&7 zE$Us?AaG(s3|vX{B(>P-?#H6q3CA`c&V-`&CTdI#s<^;#1(nJ1#Qn{`i&IexQf>h4*dRlirSH><6y?jqhn}cvGh>nxGFO3>1y_wa3$!Y%l zwC?H--!9@m*BJi|VIOc}nKgfVTAve=ysFXkk$LbF!fl5sIaa22R-=KR+(KSW+=;GZ zTw3Z)`=zm-Qp&;7x7DM81%xX4NMKL2XA$qxp2pU`f0RU4xFPcDAR+D9=mu^s+RM{T zVQ&7b9^XRhSV6UFn^1MweDPPE;_kc&?@`~@9Q?qc;-+<}J~v%DakNBD;IJ6Px^3Fy zb4w1oRb1+oq@|{&pj3BvGu$Gnc5rwexEby!)g9fak0t6$4&S;_fs4(TM7dp@ctor3 zWjxv=qyi_F==M8w+w-Ivkq1I;|4qvVD(J^njVZL-z=&4>==& zn}|$F^r^&SJ{5I1-ql@?evRm5R_4Yj3GW3ZqGMA1HZ1wnrjhAPIGnd`8l{>JZCu@` ztYJYk+f_=NXw~MJ&otes8x1L#uGBxl*>GW0K*HzdDHZp=SJ-dEb!p7Row`e?cppEL zfXQO-E~Cb7c>U`vQ=5mx*M;em!;MtEbksRA+$<$drQ|hJDY*$MrC(E(GQWLw+ltoZ zt;&+zm2-xC)AR>yv>&h#WOLOjCwhgtJKE{4bn^zP`KBfnau!eN9H%;;idG#CH&ku* zanVrNhz%xI`Er}8V3|@|K?3DMEIP+q+cB!ToG-qIl*$$RraslQ zurcTM?y;_NBoRTIkr+jW>k^vSU3!Q+%c`+W`-y}4KN=91kZGpu(%lC?rPNFigVG!P zcrW}kCqvOuO*cLw?5|B@-q@u(3<-`^>RB)&oX4qnH~bU2#WoL#j||tPF`b^(=VX=g zwFc}H^X5L){4jHKUzDqBvqPzJn~m5+hKp*`ncJV$oqEZl$oY_lUcq4r@YW}bU$&4e zpSP1-=WZ5#3Np?6&*}l4B+>JdXb*??K(xE4mpbmEE)lyv&*?65D!lSJJQd+3&*@G* z15=fn2mBv-{Zv29oGWau>U8E!(z@3-#n`7k$l-C|i=E1DSR}h}gWbAEQ>n}cVS}R| znatg~tE)`-*rsazu~~$2T=|uJ_rHoOcOp`_%J$7@>V})4%McwyC-ITtdTA6@%$ zozA@RyzbCl_U__O*c)kM+JgwsfSA~V0NYTXYOYBN+;gsWX49_;FX)Uk>DOwE(thI5 z{8OU|4V>7LVP@=$`aCx(^)sS+aOe-* zsJma(ZA0#r5a0UUE1|-Bb#SLro53Kg+)X4hEPcwwe?=Cn4TLZL>xHdN$xvSU0>U=+ z!gg%v&yZS4r-m=rQPhT8`{))jke)q7Wr9CRz0X&zB~It15%bp@EuJm4z??M92C+cehS= z)9lAJ%`Jb^J>4y71<~#`&E21ym;R<(yUV6jlrM021NdSqDr89pE6j<%=>c7(gqSb1 znlIOd%@Dc*-nMj<#dm($2EGZEb68gVxf%P4KG$6qxmcu4;gAQM*s{;f+E?^BZc%F_ zY8{7-z+0gu=T~nq|9C~GxR*}{(SI+Ec@N=Z;9j9dy{gZ-RF+jbQLWoY@m)As`3ksK zo9=y`<)orocWOw#_f?6yyK<+D?Vmx%v>GQ_4o4Ub+-tdoui6W?LebFMX*VM*ccZx` zeu`-K8`O5uG$8s}gx7%2JJmGgn%I2%s{LMchKQ@B4E-g&1Dv>`3e&rc7cIF%gvPx{ z&qBBi_}pom)2E2OE{)yi^mcq-Ief>T;dtkC)`Rr$6(GFYBg5XeglM_<;7+mo$TIC= z4vzw-N#J2h7^Tu2ofu=@FVnr{1Q@$Vcbh1E$d1poNwjKuDo(`|Hc`I3L=_yv#W6Tb zdUsVHi+97%qD%P7o1YRN8LmrXR_)Oj*Z%@IBU=UfY4sOSY}40;&Ch%ExN!-Cs0;9Y z?d4xDEMFpL#H*YOwR!-AZ6d?&_p13$dTV~Ci{9y^)5b^k>bKn~m|aPSjO8#1@EvuC zS^AnjuY-)m8Z_U~1!?OLHUVFgApO;i@p|($o@S73Vjt=>*#zH0a5SfCy3Fpd<#Ae7 zf$#U^@j1YX>u?D{N-%$PxxMZGIF~7gcI>eK$hPX$y}DUM&AY^qU}9Q1-zE>$|~kP3ETC7nw~Y21k`5&F!WN{n4VHnN-snM2A1Ve)`;s3kuAo1aIiE^gfE@^C zgfPg!Z~&Qbt|$evlw`@3gR;RG4WSa56b{k@=s`giHbaR6>LLmU>BFfwD7u(DMvyNk z&PG3yG@xu0_LmShnmAB=DHRD_Mg)*OLyaXP5MWcT07c_ToQp9io&ba5iRdoJW)c;+ z0vQBA4k!cFz<(ur5CA!#81OP+RSL>Lh2Sb|K`3D|g@ZDnrjQr}K`Bswq7dK*=^y}# zKrtu*6~I3gJ;(t?pcGVtgdjRl0?I)(NS{W}fih4IDyA|1)d=ZVlW;l_7Qs9cfTDZ~ z0}0n)463gs!x`vjQs{MB`Dand*~Ee3IaGWux_RUSf(67~k39&?#|D%xpaO-&Ed)1U zyC{Tm5r#Kn1cD%E2?hQc-A!Z!0ynb_uu9Uw2oMAXU@h1N_Ja>V6>v_mg@D0e9GC-^ zf%V{7@K5kH(5JOZ0)0XpvcN=e9gy%nU@LeLdSXQxB!I4a>xfafd{~L@GAHioCeK*(yA923Z{TrU>SH2 zl!CqB3s3_({Y<7{JeUq{1P_9z!C_DhVt%2LU;r5X3*$c%;byQ7>;{LyNf3XQODZrJ zi~^HE9#{(Q1f}2rcn?&9)4=%;SDWA*a3L50t^x&M8Mqg01$#g_`0785{|^Xpzmf=C z2*!h1U>R5sc7iv-N8o#)Yq&8CQb9kE4W@wk;12K*C3{V6f z2yxg9UIib5ufY$Xv367^FbIqRGr)YX0z3xZ21mgu(44EZRFDBif+?U7+y)*3JHT7u zL+~AlYCzs#5a>0Y!?oaUumijfJ^|H0bAE3Rx`Sb0s?XW|>OuWw^H4FDA>q%^QI1M} zhD8~nyBb{#I{76m{J966{PY^+OI7%@f(W~A=+3yF2rd6` zJ^#b?{14aj@XA$xxSs#vdj5y&`5&(5f4H9i;d=gu>-ql&*YlR{srR?8=iAMmZ*;5H z=lL=-dyg-iKXdN2fd#Vzfw9B0vI3K?R9nr-Z}_L>ZKm0A-B$ZdkK?*M@3pu@=sR=Q zaor{^YxvNK>AeF1euFz9niSo`?7+J3{uY^q^CI%RA}cd%q7C;BknHk)!^e#qGj8fd zV}=b6xH*`ANX9`^b)0uFTy0Xm)feh%X3Dp`sbspjOK6PQ^DPxRY>s|QNy|-xf9cM= z$*1eTct!fjCg#e2>0JGV`Rl*f=A!vC3-itONzQrZ$A9T~J;FqNryt}s9e?>w z4BY^&A-e4FFZJ}uhlle&AWSn2Pac?aqIY=ADx|OB>Vdd)};Z++=;PlXRK6{CnQ}5ogwZPYaaU|2_YAbvn*`^F8k* zdCjE!TTj(5nx+5NgLSld_20S`{?zaPoAlF6!&A@;=7LlDJiX6Mm(X+O-c#f@!2JD` z&S#W+o#uTd&zV1;rf**{51-b*M9H`wG!OrvPe`FZ>goDkbMi-hebir^%*=FC5alGA zCTDbGbNd-RLpR-h;taRyqfRxTeJ0S5Kjv!pgKlIR{G$KEOGflr-Kybr37PW>^5>dE zzw*Yxtg|%AZ!SNpFKqurqs-~ErB5!JHYb1nwA!wj#6&!7{(6=_`Z^hJs?X{G?-}X+ zA3a6~%+mibDegAU{6|k=!ZiC;U!?Cb6MogxbdEWh;IuVgG@uUsnmNtQfFG%4LXD2r zFPT;~dTPv)W|{Nz7vvY3SAW%gO(4nfnP+Qs)96#NnRzo8n3sOlT}*Wi!~CkLso^j6 zqt;#ST%m7Rx5LSbn%Fp#CTw+_PNt+rH#6O|SC%$jY2aZW3RexhvS{LdXae{-dVtI(4z@W+Gp-)LPeGNsEKn(e_)hzBq zLarzz8wS{wqb2`>6Z{b{{wK?8`$STu5(do!w3{IrC zC!1S^CYrw|GN@AxKckE#{j4OXziw|fCOPNEJmOCDx$e%?sbTLvvUx5wKPAx(eNC&D zr0!*=v~;d={@vKT*pi8oZ@z3v=ZrPYT9M~CGp!X9rIXpy%DF_R3XL#4_tjG0VrC`N z%kP=HlAZIMGx6r-WG9vRbu`)O?EDySVp@~g>!xpO=OVqrENac*9WXDnb}rQ2%xO`s zGy~c=yZ}-rW(!l)#_88^c|vBvw1o@IQ;y@0o_ZNoz119Ts+t1%`a`4N!`rN?U-!&W?MV5{qybu3a92To}OP& zICI|Iz=FcOK;Vk3sh3T<()8`@JlW<`U*>{>g@w}tnWZ%}XKYsO({~KOOb#=l+g;k2?FQqjH819X558qZH`_H>5m zP~KbIqi?3vrsn)WhFl7dPsH&LIS7Bl#Zn0}57?=sRy=8Okb8_U57;S5E4&xieo4#2 zc4|ReFD(z;saPHhkhDB>r}_g)D~}5B(4CtW4yn)mUgB!_-cDZP61ZDuFELNzsR=+5 z2jSbSEDy4bKNm+3(ZgZy5aAlouYz0Ya9bQfvXLX5Kg3aF11P8n@lXrG!(cf^!kfW; z$ffX6FbTODzO5TIKg!P|@U$LEZ9!iEKh_fuVf3YNlsu*;Ery=~E6|t0KLK&(l}Fef z2VzqSzZUB414*=p;cEiUT%s?5o)C}ozCiSWi$h$}*$8<=;}keX zrt+Z19B>x70KOf_1T2O_*?6au#cv&Z#-U5|A!j@JOpe;79I_DA?Lt}xwsX4Kwa`1Zxj1-iNz{@ac0 zlGv2PtCmoJ^cLK288)BNLvV|g3>C5;ehEyb5@qn?tFbv8q813{#f&B0BK*wVxE&*x z!C&9Qjzt00@cZ{NSI|d3OCb+gti2B>Ifh1f9XN|z0;jCwQBl&S!xQdjI4L*?|FE9% zM^+EvAss4V)1ftG@T84icLm{Zfh4YmFW=-nf+9TOQM#G}gx7+A6b!EeIZ`lu-Q&1j zGm#766Hk!OJLCgD@gz$TxfH%@n^Jx%5h_M#`jlr>=fjPEE4rAcJ%4ZE)_M7L zARAeD9+-q&0E^@GcE-ET0h?dK(S@C}g$M2AIU4MRb9OTRF-#T&bp=R9j&x-em)5&> zv5wh>g$lLC=X7RVC@@9k$lV5JEE2uhHJlMZmwLKgOe zeIWuOd|S>CFlKd5`nWV4s&n8MNB)OFA(aqb@h$}*3%>|9AeX@}{F7~!wO$7AILzK6 zGW_Culp!*F-Vvof#y%YmJ!AtVaOd|~esoJZ9Qr@Hk;)apr$GiSj(ng)9_$D|>=F4O zh&&+j_m5bX>?^__gM-Mz-%1!+IPPP@N7(=C9HQ|p(88%HhtRd2%{@8a#iL22|h}2i$W%9IRmcB~V1*GaFF>4?60# zH~?P(1Mv87$p<+I z@B0_S+>Ssw!mw&uL~C;3(cepLk>RGN=ndoq__@;z50xl`PyfKuLa%;gxPa{Q#qf!< z$kMmj%= zQ{=FCJX_EU-wG;`i{a!Z_#lwh4?h9?=u6@MfFc^En&MpBf|g63aN8uF!>nZg7vH>A zEt!>HA;WKh`@Y5q?%s-oZ?Pia5Rg?MzI)dvGy-`7?aKfgtxc3uJE@b@EdmsxuvfLj>+qm{)G@OdB=5{JOW9c@~8u^&(g zaS$AxVk-pq>_l%-QE?b-e-005(i7r1_!5x(L*hZWJJoBwcoNR(?6n?`LN%d_rx(XU zeJ;a6M&e-jbQ=C6WF(G;7j*S1Ar6PD!6Y&j$HR}TEDnf$a6S~hI3jKUvQoq$@oYE7 zUjpKpcn6S{iHD-@?$u5_6_;9BJQkbuz`=;|6VJujK+=i_<3THnCu3GmFRgeqZU>y^bj4>Q`n-+cw zB%>F86Ld!wpUzhYdlO20J0}nE3J@R9pR64A^^^vP&u7noS0VBJJOI##Tqn?3Szcms z25majlf@}?5(rY5IES9GdT|on0HkH&ESfUh>$$Mgs4QJ^9=+va&qka`M~$#60{#w2 zT5&2}kmq|{bios4?l0^GI;73n@=hsB{Vrbcb8_fv=7jKa5I`3G0puWym+J#S3Knly z-kt2q;`REOmBst@#_^tBykJvuJz2bAD?vz>oVdlVnP6)Te+S&wz-uOYa@bu~^x`&~ zG0EE-#C?|A&)yCQ?*#4&f{%eo(kpPAE4`&CZnSp-`L=}nY)Box$}>us%(oRF5#mPs zB9O5cciNw^=P(y9=MTmt_SB(roY;FeQ8*$)qKWyU`Tfwy$J zH7$alvT`Z>g_RS6*a7(-FMPk1#V7Zmm8;=S)4T%G;W<_=fS6EB(3=K9>12}ptq`F@#~dUAiQ{{ zH+jX+H{&`lAMy8XJIm9D#PRnR8xRNJ4}qK{!j8a_kvIfTp6iXVI0h%q^TyZ@zYJtK zmBEt>Yy;r4R#w;J#|hl!3ST(ilf{wvllhFlM2JW6;|q8Ofx^VIcy^&zQ}HmqVxc_= z!4q%r^x|>cVi6U^-VZ+pwa>mVG_ll?TM?fkk|Fm-q$cf}zxbre^uB5?}tt@=Kl?&kwRu$xYu$|PKOVGges4}wR+*C+dP|Oc$}4U;aNcPlqYglT6qop zHOL?zc~m8I?d>cX0!8p6U=p(Yr_euuRD!=fQycE^dPR62kW7VBS9mtUtF62SehY|A zIox-pXVVW}4n!}!eigk}#rSVP@ULbktMYj48oC)d7rq4C12K%s)hxBGxxdg5NF-I-0^K9f_oE`y%N9gs?Lv%Mt z{gfpHS6I1v12>Hx_Vn_s)f6ksb3`kxERXi=1L^dZusm%e`3TFCI3f$n!!#lb4*`i( zTK>)HaS)Ogmm;+Mi`RNTe7lv4;UBD=P@>fhKI5M}1oC4vum* z>QE^z&5ExbTUTr?-ul4SlC7m%%eEfaTE6vztrc4GetBoneLocation(RemapAsset[Keypoints[24]]) + RightAnkleToHeelOffset; } - else // body 38 or 70 + else // body 38 { if (LeftAnkleToHeelOffset == 0 && RightAnkleToHeelOffset == 0) { diff --git a/Plugins/Stereolabs/Source/ZED/Public/Core/AnimNode_ZEDPose.h b/Plugins/Stereolabs/Source/ZED/Public/Core/AnimNode_ZEDPose.h index 95142d13..e73c654b 100644 --- a/Plugins/Stereolabs/Source/ZED/Public/Core/AnimNode_ZEDPose.h +++ b/Plugins/Stereolabs/Source/ZED/Public/Core/AnimNode_ZEDPose.h @@ -281,6 +281,7 @@ static TMap Keypoints34Mirrored = TMap{ {33, "LEFT_HEEL"} }; +#if 0 const TArray parents70Idx = { -1, 0, @@ -354,87 +355,6 @@ const TArray parents70Idx = { 52, }; -static TMap Keypoints38 = TMap{ - {0, "PELVIS"}, - {1, "SPINE_1"}, - {2, "SPINE_2"}, - {3, "SPINE_3"}, - {4, "NECK"}, - {5, "NOSE"}, - {6, "LEFT_EYE"}, - {7, "RIGHT_EYE"}, - {8, "LEFT_EAR"}, - {9, "RIGHT_EAR"}, - {10, "LEFT_CLAVICLE"}, - {11, "RIGHT_CLAVICLE"}, - {12, "LEFT_SHOULDER"}, - {13, "RIGHT_SHOULDER"}, - {14, "LEFT_ELBOW"}, - {15, "RIGHT_ELBOW"}, - {16, "LEFT_WRIST"}, - {17, "RIGHT_WRIST"}, - {18, "LEFT_HIP"}, - {19, "RIGHT_HIP"}, - {20, "LEFT_KNEE"}, - {21, "RIGHT_KNEE"}, - {22, "LEFT_ANKLE"}, - {23, "RIGHT_ANKLE"}, - {24, "LEFT_BIG_TOE"}, - {25, "RIGHT_BIG_TOE"}, - {26, "LEFT_SMALL_TOE"}, - {27, "RIGHT_SMALL_TOE"}, - {28, "LEFT_HEEL"}, - {29, "RIGHT_HEEL"}, - {30, "LEFT_HAND_THUMB_4"}, - {31, "RIGHT_HAND_THUMB_4"}, - {32, "LEFT_HAND_INDEX_1"}, - {33, "RIGHT_HAND_INDEX_1"}, - {34, "LEFT_HAND_MIDDLE_4"}, - {35, "RIGHT_HAND_MIDDLE_4"}, - {36, "LEFT_HAND_PINKY_1"}, - {37, "RIGHT_HAND_PINKY_1"}, -}; - -static TMap Keypoints38Mirrored = TMap{ - {0, "PELVIS"}, - {1, "SPINE_1"}, - {2, "SPINE_2"}, - {3, "SPINE_3"}, - {4, "NECK"}, - {5, "NOSE"}, - {6, "RIGHT_EYE"}, - {7, "LEFT_EYE"}, - {8, "RIGHT_EAR"}, - {9, "LEFT_EAR"}, - {10, "RIGHT_CLAVICLE"}, - {11, "LEFT_CLAVICLE"}, - {12, "RIGHT_SHOULDER"}, - {13, "LEFT_SHOULDER"}, - {14, "RIGHT_ELBOW"}, - {15, "LEFT_ELBOW"}, - {16, "RIGHT_WRIST"}, - {17, "LEFT_WRIST"}, - {18, "RIGHT_HIP"}, - {19, "LEFT_HIP"}, - {20, "RIGHT_KNEE"}, - {21, "LEFT_KNEE"}, - {22, "RIGHT_ANKLE"}, - {23, "LEFT_ANKLE"}, - {24, "RIGHT_BIG_TOE"}, - {25, "LEFT_BIG_TOE"}, - {26, "RIGHT_SMALL_TOE"}, - {27, "LEFT_SMALL_TOE"}, - {28, "RIGHT_HEEL"}, - {29, "LEFT_HEEL"}, - {30, "RIGHT_HAND_THUMB_4"}, - {31, "LEFT_HAND_THUMB_4"}, - {32, "RIGHT_HAND_INDEX_1"}, - {33, "LEFT_HAND_INDEX_1"}, - {34, "RIGHT_HAND_MIDDLE_4"}, - {35, "LEFT_HAND_MIDDLE_4"}, - {36, "RIGHT_HAND_PINKY_1"}, - {37, "LEFT_HAND_PINKY_1"}, -}; static TMap Keypoints70 = TMap{ {0, "PELVIS"}, @@ -582,53 +502,125 @@ static TMap Keypoints70Mirrored = TMap{ {69, "LEFT_HAND_PINKY_4"} }; -static FName GetParent34BoneName(FName BoneName) +static FName GetParent70BoneName(FName BoneName) { FName ParentBoneName = "None"; if (BoneName.IsEqual("PELVIS")) ParentBoneName = "None"; - else if (BoneName.IsEqual("NAVAL_SPINE")) + else if (BoneName.IsEqual("SPINE_1")) ParentBoneName = "PELVIS"; - else if (BoneName.IsEqual("CHEST_SPINE")) - ParentBoneName = "NAVAL_SPINE"; + else if (BoneName.IsEqual("SPINE_2")) + ParentBoneName = "SPINE_1"; + else if (BoneName.IsEqual("SPINE_3")) + ParentBoneName = "SPINE_2"; else if (BoneName.IsEqual("NECK")) - ParentBoneName = "CHEST_SPINE"; + ParentBoneName = "SPINE_3"; else if (BoneName.IsEqual("LEFT_CLAVICLE")) - ParentBoneName = "CHEST_SPINE"; + ParentBoneName = "SPINE_3"; else if (BoneName.IsEqual("LEFT_SHOULDER")) ParentBoneName = "LEFT_CLAVICLE"; else if (BoneName.IsEqual("LEFT_ELBOW")) ParentBoneName = "LEFT_SHOULDER"; else if (BoneName.IsEqual("LEFT_WRIST")) ParentBoneName = "LEFT_ELBOW"; - else if (BoneName.IsEqual("LEFT_HAND")) + else if (BoneName.IsEqual("LEFT_HAND_THUMB_1")) ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HANDTIP")) - ParentBoneName = "LEFT_HAND"; - else if (BoneName.IsEqual("LEFT_THUMB")) + else if (BoneName.IsEqual("LEFT_HAND_THUMB_2")) + ParentBoneName = "LEFT_HAND_THUMB_1"; + else if (BoneName.IsEqual("LEFT_HAND_THUMB_3")) + ParentBoneName = "LEFT_HAND_THUMB_2"; + else if (BoneName.IsEqual("LEFT_HAND_THUMB_4")) + ParentBoneName = "LEFT_HAND_THUMB_3"; + else if (BoneName.IsEqual("LEFT_HAND_INDEX_1")) + ParentBoneName = "LEFT_WRIST"; + else if (BoneName.IsEqual("LEFT_HAND_INDEX_2")) + ParentBoneName = "LEFT_HAND_INDEX_1"; + else if (BoneName.IsEqual("LEFT_HAND_INDEX_3")) + ParentBoneName = "LEFT_HAND_INDEX_2"; + else if (BoneName.IsEqual("LEFT_HAND_INDEX_4")) + ParentBoneName = "LEFT_HAND_INDEX_3"; + else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_1")) + ParentBoneName = "LEFT_WRIST"; + else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_2")) + ParentBoneName = "LEFT_HAND_MIDDLE_1"; + else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_3")) + ParentBoneName = "LEFT_HAND_MIDDLE_2"; + else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_4")) + ParentBoneName = "LEFT_HAND_MIDDLE_3"; + else if (BoneName.IsEqual("LEFT_HAND_RING_1")) + ParentBoneName = "LEFT_WRIST"; + else if (BoneName.IsEqual("LEFT_HAND_RING_2")) + ParentBoneName = "LEFT_HAND_RING_1"; + else if (BoneName.IsEqual("LEFT_HAND_RING_3")) + ParentBoneName = "LEFT_HAND_RING_2"; + else if (BoneName.IsEqual("LEFT_HAND_RING_4")) + ParentBoneName = "LEFT_HAND_RING_3"; + else if (BoneName.IsEqual("LEFT_HAND_PINKY_1")) ParentBoneName = "LEFT_WRIST"; + else if (BoneName.IsEqual("LEFT_HAND_PINKY_2")) + ParentBoneName = "LEFT_HAND_PINKY_1"; + else if (BoneName.IsEqual("LEFT_HAND_PINKY_3")) + ParentBoneName = "LEFT_HAND_PINKY_2"; + else if (BoneName.IsEqual("LEFT_HAND_PINKY_4")) + ParentBoneName = "LEFT_HAND_PINKY_3"; else if (BoneName.IsEqual("RIGHT_CLAVICLE")) - ParentBoneName = "CHEST_SPINE"; + ParentBoneName = "SPINE_3"; else if (BoneName.IsEqual("RIGHT_SHOULDER")) ParentBoneName = "RIGHT_CLAVICLE"; else if (BoneName.IsEqual("RIGHT_ELBOW")) ParentBoneName = "RIGHT_SHOULDER"; else if (BoneName.IsEqual("RIGHT_WRIST")) ParentBoneName = "RIGHT_ELBOW"; - else if (BoneName.IsEqual("RIGHT_HAND")) + else if (BoneName.IsEqual("RIGHT_HAND_THUMB_1")) ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HANDTIP")) - ParentBoneName = "RIGHT_HAND"; - else if (BoneName.IsEqual("RIGHT_THUMB")) + else if (BoneName.IsEqual("RIGHT_HAND_THUMB_2")) + ParentBoneName = "RIGHT_HAND_THUMB_1"; + else if (BoneName.IsEqual("RIGHT_HAND_THUMB_3")) + ParentBoneName = "RIGHT_HAND_THUMB_2"; + else if (BoneName.IsEqual("RIGHT_HAND_THUMB_4")) + ParentBoneName = "RIGHT_HAND_THUMB_3"; + else if (BoneName.IsEqual("RIGHT_HAND_INDEX_1")) ParentBoneName = "RIGHT_WRIST"; + else if (BoneName.IsEqual("RIGHT_HAND_INDEX_2")) + ParentBoneName = "RIGHT_HAND_INDEX_1"; + else if (BoneName.IsEqual("RIGHT_HAND_INDEX_3")) + ParentBoneName = "RIGHT_HAND_INDEX_2"; + else if (BoneName.IsEqual("RIGHT_HAND_INDEX_4")) + ParentBoneName = "RIGHT_HAND_INDEX_3"; + else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_1")) + ParentBoneName = "RIGHT_WRIST"; + else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_2")) + ParentBoneName = "RIGHT_HAND_MIDDLE_1"; + else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_3")) + ParentBoneName = "RIGHT_HAND_MIDDLE_2"; + else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_4")) + ParentBoneName = "RIGHT_HAND_MIDDLE_3"; + else if (BoneName.IsEqual("RIGHT_HAND_RING_1")) + ParentBoneName = "RIGHT_WRIST"; + else if (BoneName.IsEqual("RIGHT_HAND_RING_2")) + ParentBoneName = "RIGHT_HAND_RING_1"; + else if (BoneName.IsEqual("RIGHT_HAND_RING_3")) + ParentBoneName = "RIGHT_HAND_RING_2"; + else if (BoneName.IsEqual("RIGHT_HAND_RING_4")) + ParentBoneName = "RIGHT_HAND_RING_3"; + else if (BoneName.IsEqual("RIGHT_HAND_PINKY_1")) + ParentBoneName = "RIGHT_WRIST"; + else if (BoneName.IsEqual("RIGHT_HAND_PINKY_2")) + ParentBoneName = "RIGHT_HAND_PINKY_1"; + else if (BoneName.IsEqual("RIGHT_HAND_PINKY_3")) + ParentBoneName = "RIGHT_HAND_PINKY_2"; + else if (BoneName.IsEqual("RIGHT_HAND_PINKY_4")) + ParentBoneName = "RIGHT_HAND_PINKY_3"; else if (BoneName.IsEqual("LEFT_HIP")) ParentBoneName = "PELVIS"; else if (BoneName.IsEqual("LEFT_KNEE")) ParentBoneName = "LEFT_HIP"; else if (BoneName.IsEqual("LEFT_ANKLE")) ParentBoneName = "LEFT_KNEE"; - else if (BoneName.IsEqual("LEFT_FOOT")) + else if (BoneName.IsEqual("LEFT_BIG_TOE")) + ParentBoneName = "LEFT_ANKLE"; + else if (BoneName.IsEqual("LEFT_SMALL_TOE")) ParentBoneName = "LEFT_ANKLE"; else if (BoneName.IsEqual("RIGHT_HIP")) ParentBoneName = "PELVIS"; @@ -636,20 +628,20 @@ static FName GetParent34BoneName(FName BoneName) ParentBoneName = "RIGHT_HIP"; else if (BoneName.IsEqual("RIGHT_ANKLE")) ParentBoneName = "RIGHT_KNEE"; - else if (BoneName.IsEqual("RIGHT_FOOT")) + else if (BoneName.IsEqual("RIGHT_BIG_TOE")) + ParentBoneName = "RIGHT_ANKLE"; + else if (BoneName.IsEqual("RIGHT_SMALL_TOE")) ParentBoneName = "RIGHT_ANKLE"; - else if (BoneName.IsEqual("HEAD")) - ParentBoneName = "NECK"; else if (BoneName.IsEqual("NOSE")) - ParentBoneName = "HEAD"; + ParentBoneName = "NECK"; else if (BoneName.IsEqual("LEFT_EYE")) - ParentBoneName = "HEAD"; + ParentBoneName = "NECK"; else if (BoneName.IsEqual("RIGHT_EYE")) - ParentBoneName = "HEAD"; + ParentBoneName = "NECK"; else if (BoneName.IsEqual("LEFT_EAR")) - ParentBoneName = "HEAD"; + ParentBoneName = "LEFT_EYE"; else if (BoneName.IsEqual("RIGHT_EAR")) - ParentBoneName = "HEAD"; + ParentBoneName = "RIGHT_EYE"; else if (BoneName.IsEqual("LEFT_HEEL")) ParentBoneName = "LEFT_ANKLE"; else if (BoneName.IsEqual("RIGHT_HEEL")) @@ -658,51 +650,129 @@ static FName GetParent34BoneName(FName BoneName) return ParentBoneName; } -static FName GetParent38BoneName(FName BoneName) +#endif + +static TMap Keypoints38 = TMap{ + {0, "PELVIS"}, + {1, "SPINE_1"}, + {2, "SPINE_2"}, + {3, "SPINE_3"}, + {4, "NECK"}, + {5, "NOSE"}, + {6, "LEFT_EYE"}, + {7, "RIGHT_EYE"}, + {8, "LEFT_EAR"}, + {9, "RIGHT_EAR"}, + {10, "LEFT_CLAVICLE"}, + {11, "RIGHT_CLAVICLE"}, + {12, "LEFT_SHOULDER"}, + {13, "RIGHT_SHOULDER"}, + {14, "LEFT_ELBOW"}, + {15, "RIGHT_ELBOW"}, + {16, "LEFT_WRIST"}, + {17, "RIGHT_WRIST"}, + {18, "LEFT_HIP"}, + {19, "RIGHT_HIP"}, + {20, "LEFT_KNEE"}, + {21, "RIGHT_KNEE"}, + {22, "LEFT_ANKLE"}, + {23, "RIGHT_ANKLE"}, + {24, "LEFT_BIG_TOE"}, + {25, "RIGHT_BIG_TOE"}, + {26, "LEFT_SMALL_TOE"}, + {27, "RIGHT_SMALL_TOE"}, + {28, "LEFT_HEEL"}, + {29, "RIGHT_HEEL"}, + {30, "LEFT_HAND_THUMB_4"}, + {31, "RIGHT_HAND_THUMB_4"}, + {32, "LEFT_HAND_INDEX_1"}, + {33, "RIGHT_HAND_INDEX_1"}, + {34, "LEFT_HAND_MIDDLE_4"}, + {35, "RIGHT_HAND_MIDDLE_4"}, + {36, "LEFT_HAND_PINKY_1"}, + {37, "RIGHT_HAND_PINKY_1"}, +}; + +static TMap Keypoints38Mirrored = TMap{ + {0, "PELVIS"}, + {1, "SPINE_1"}, + {2, "SPINE_2"}, + {3, "SPINE_3"}, + {4, "NECK"}, + {5, "NOSE"}, + {6, "RIGHT_EYE"}, + {7, "LEFT_EYE"}, + {8, "RIGHT_EAR"}, + {9, "LEFT_EAR"}, + {10, "RIGHT_CLAVICLE"}, + {11, "LEFT_CLAVICLE"}, + {12, "RIGHT_SHOULDER"}, + {13, "LEFT_SHOULDER"}, + {14, "RIGHT_ELBOW"}, + {15, "LEFT_ELBOW"}, + {16, "RIGHT_WRIST"}, + {17, "LEFT_WRIST"}, + {18, "RIGHT_HIP"}, + {19, "LEFT_HIP"}, + {20, "RIGHT_KNEE"}, + {21, "LEFT_KNEE"}, + {22, "RIGHT_ANKLE"}, + {23, "LEFT_ANKLE"}, + {24, "RIGHT_BIG_TOE"}, + {25, "LEFT_BIG_TOE"}, + {26, "RIGHT_SMALL_TOE"}, + {27, "LEFT_SMALL_TOE"}, + {28, "RIGHT_HEEL"}, + {29, "LEFT_HEEL"}, + {30, "RIGHT_HAND_THUMB_4"}, + {31, "LEFT_HAND_THUMB_4"}, + {32, "RIGHT_HAND_INDEX_1"}, + {33, "LEFT_HAND_INDEX_1"}, + {34, "RIGHT_HAND_MIDDLE_4"}, + {35, "LEFT_HAND_MIDDLE_4"}, + {36, "RIGHT_HAND_PINKY_1"}, + {37, "LEFT_HAND_PINKY_1"}, +}; + +static FName GetParent34BoneName(FName BoneName) { FName ParentBoneName = "None"; if (BoneName.IsEqual("PELVIS")) ParentBoneName = "None"; - else if (BoneName.IsEqual("SPINE_1")) + else if (BoneName.IsEqual("NAVAL_SPINE")) ParentBoneName = "PELVIS"; - else if (BoneName.IsEqual("SPINE_2")) - ParentBoneName = "SPINE_1"; - else if (BoneName.IsEqual("SPINE_3")) - ParentBoneName = "SPINE_2"; + else if (BoneName.IsEqual("CHEST_SPINE")) + ParentBoneName = "NAVAL_SPINE"; else if (BoneName.IsEqual("NECK")) - ParentBoneName = "SPINE_3"; + ParentBoneName = "CHEST_SPINE"; else if (BoneName.IsEqual("LEFT_CLAVICLE")) - ParentBoneName = "SPINE_3"; + ParentBoneName = "CHEST_SPINE"; else if (BoneName.IsEqual("LEFT_SHOULDER")) ParentBoneName = "LEFT_CLAVICLE"; else if (BoneName.IsEqual("LEFT_ELBOW")) ParentBoneName = "LEFT_SHOULDER"; else if (BoneName.IsEqual("LEFT_WRIST")) ParentBoneName = "LEFT_ELBOW"; - else if (BoneName.IsEqual("LEFT_HAND_THUMB_4")) - ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HAND_INDEX_1")) - ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_4")) + else if (BoneName.IsEqual("LEFT_HAND")) ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HAND_PINKY_1")) + else if (BoneName.IsEqual("LEFT_HANDTIP")) + ParentBoneName = "LEFT_HAND"; + else if (BoneName.IsEqual("LEFT_THUMB")) ParentBoneName = "LEFT_WRIST"; else if (BoneName.IsEqual("RIGHT_CLAVICLE")) - ParentBoneName = "SPINE_3"; + ParentBoneName = "CHEST_SPINE"; else if (BoneName.IsEqual("RIGHT_SHOULDER")) ParentBoneName = "RIGHT_CLAVICLE"; else if (BoneName.IsEqual("RIGHT_ELBOW")) ParentBoneName = "RIGHT_SHOULDER"; else if (BoneName.IsEqual("RIGHT_WRIST")) ParentBoneName = "RIGHT_ELBOW"; - else if (BoneName.IsEqual("RIGHT_HAND_THUMB_4")) - ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HAND_INDEX_1")) - ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_4")) + else if (BoneName.IsEqual("RIGHT_HAND")) ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HAND_PINKY_1")) + else if (BoneName.IsEqual("RIGHT_HANDTIP")) + ParentBoneName = "RIGHT_HAND"; + else if (BoneName.IsEqual("RIGHT_THUMB")) ParentBoneName = "RIGHT_WRIST"; else if (BoneName.IsEqual("LEFT_HIP")) ParentBoneName = "PELVIS"; @@ -710,9 +780,7 @@ static FName GetParent38BoneName(FName BoneName) ParentBoneName = "LEFT_HIP"; else if (BoneName.IsEqual("LEFT_ANKLE")) ParentBoneName = "LEFT_KNEE"; - else if (BoneName.IsEqual("LEFT_BIG_TOE")) - ParentBoneName = "LEFT_ANKLE"; - else if (BoneName.IsEqual("LEFT_SMALL_TOE")) + else if (BoneName.IsEqual("LEFT_FOOT")) ParentBoneName = "LEFT_ANKLE"; else if (BoneName.IsEqual("RIGHT_HIP")) ParentBoneName = "PELVIS"; @@ -720,20 +788,20 @@ static FName GetParent38BoneName(FName BoneName) ParentBoneName = "RIGHT_HIP"; else if (BoneName.IsEqual("RIGHT_ANKLE")) ParentBoneName = "RIGHT_KNEE"; - else if (BoneName.IsEqual("RIGHT_BIG_TOE")) - ParentBoneName = "RIGHT_ANKLE"; - else if (BoneName.IsEqual("RIGHT_SMALL_TOE")) + else if (BoneName.IsEqual("RIGHT_FOOT")) ParentBoneName = "RIGHT_ANKLE"; - else if (BoneName.IsEqual("NOSE")) + else if (BoneName.IsEqual("HEAD")) ParentBoneName = "NECK"; + else if (BoneName.IsEqual("NOSE")) + ParentBoneName = "HEAD"; else if (BoneName.IsEqual("LEFT_EYE")) - ParentBoneName = "NECK"; + ParentBoneName = "HEAD"; else if (BoneName.IsEqual("RIGHT_EYE")) - ParentBoneName = "NECK"; + ParentBoneName = "HEAD"; else if (BoneName.IsEqual("LEFT_EAR")) - ParentBoneName = "LEFT_EYE"; + ParentBoneName = "HEAD"; else if (BoneName.IsEqual("RIGHT_EAR")) - ParentBoneName = "RIGHT_EYE"; + ParentBoneName = "HEAD"; else if (BoneName.IsEqual("LEFT_HEEL")) ParentBoneName = "LEFT_ANKLE"; else if (BoneName.IsEqual("RIGHT_HEEL")) @@ -742,7 +810,7 @@ static FName GetParent38BoneName(FName BoneName) return ParentBoneName; } -static FName GetParent70BoneName(FName BoneName) +static FName GetParent38BoneName(FName BoneName) { FName ParentBoneName = "None"; @@ -764,46 +832,14 @@ static FName GetParent70BoneName(FName BoneName) ParentBoneName = "LEFT_SHOULDER"; else if (BoneName.IsEqual("LEFT_WRIST")) ParentBoneName = "LEFT_ELBOW"; - else if (BoneName.IsEqual("LEFT_HAND_THUMB_1")) - ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HAND_THUMB_2")) - ParentBoneName = "LEFT_HAND_THUMB_1"; - else if (BoneName.IsEqual("LEFT_HAND_THUMB_3")) - ParentBoneName = "LEFT_HAND_THUMB_2"; else if (BoneName.IsEqual("LEFT_HAND_THUMB_4")) - ParentBoneName = "LEFT_HAND_THUMB_3"; - else if (BoneName.IsEqual("LEFT_HAND_INDEX_1")) ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HAND_INDEX_2")) - ParentBoneName = "LEFT_HAND_INDEX_1"; - else if (BoneName.IsEqual("LEFT_HAND_INDEX_3")) - ParentBoneName = "LEFT_HAND_INDEX_2"; - else if (BoneName.IsEqual("LEFT_HAND_INDEX_4")) - ParentBoneName = "LEFT_HAND_INDEX_3"; - else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_1")) + else if (BoneName.IsEqual("LEFT_HAND_INDEX_1")) ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_2")) - ParentBoneName = "LEFT_HAND_MIDDLE_1"; - else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_3")) - ParentBoneName = "LEFT_HAND_MIDDLE_2"; else if (BoneName.IsEqual("LEFT_HAND_MIDDLE_4")) - ParentBoneName = "LEFT_HAND_MIDDLE_3"; - else if (BoneName.IsEqual("LEFT_HAND_RING_1")) ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HAND_RING_2")) - ParentBoneName = "LEFT_HAND_RING_1"; - else if (BoneName.IsEqual("LEFT_HAND_RING_3")) - ParentBoneName = "LEFT_HAND_RING_2"; - else if (BoneName.IsEqual("LEFT_HAND_RING_4")) - ParentBoneName = "LEFT_HAND_RING_3"; else if (BoneName.IsEqual("LEFT_HAND_PINKY_1")) ParentBoneName = "LEFT_WRIST"; - else if (BoneName.IsEqual("LEFT_HAND_PINKY_2")) - ParentBoneName = "LEFT_HAND_PINKY_1"; - else if (BoneName.IsEqual("LEFT_HAND_PINKY_3")) - ParentBoneName = "LEFT_HAND_PINKY_2"; - else if (BoneName.IsEqual("LEFT_HAND_PINKY_4")) - ParentBoneName = "LEFT_HAND_PINKY_3"; else if (BoneName.IsEqual("RIGHT_CLAVICLE")) ParentBoneName = "SPINE_3"; else if (BoneName.IsEqual("RIGHT_SHOULDER")) @@ -812,46 +848,14 @@ static FName GetParent70BoneName(FName BoneName) ParentBoneName = "RIGHT_SHOULDER"; else if (BoneName.IsEqual("RIGHT_WRIST")) ParentBoneName = "RIGHT_ELBOW"; - else if (BoneName.IsEqual("RIGHT_HAND_THUMB_1")) - ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HAND_THUMB_2")) - ParentBoneName = "RIGHT_HAND_THUMB_1"; - else if (BoneName.IsEqual("RIGHT_HAND_THUMB_3")) - ParentBoneName = "RIGHT_HAND_THUMB_2"; else if (BoneName.IsEqual("RIGHT_HAND_THUMB_4")) - ParentBoneName = "RIGHT_HAND_THUMB_3"; - else if (BoneName.IsEqual("RIGHT_HAND_INDEX_1")) ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HAND_INDEX_2")) - ParentBoneName = "RIGHT_HAND_INDEX_1"; - else if (BoneName.IsEqual("RIGHT_HAND_INDEX_3")) - ParentBoneName = "RIGHT_HAND_INDEX_2"; - else if (BoneName.IsEqual("RIGHT_HAND_INDEX_4")) - ParentBoneName = "RIGHT_HAND_INDEX_3"; - else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_1")) + else if (BoneName.IsEqual("RIGHT_HAND_INDEX_1")) ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_2")) - ParentBoneName = "RIGHT_HAND_MIDDLE_1"; - else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_3")) - ParentBoneName = "RIGHT_HAND_MIDDLE_2"; else if (BoneName.IsEqual("RIGHT_HAND_MIDDLE_4")) - ParentBoneName = "RIGHT_HAND_MIDDLE_3"; - else if (BoneName.IsEqual("RIGHT_HAND_RING_1")) ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HAND_RING_2")) - ParentBoneName = "RIGHT_HAND_RING_1"; - else if (BoneName.IsEqual("RIGHT_HAND_RING_3")) - ParentBoneName = "RIGHT_HAND_RING_2"; - else if (BoneName.IsEqual("RIGHT_HAND_RING_4")) - ParentBoneName = "RIGHT_HAND_RING_3"; else if (BoneName.IsEqual("RIGHT_HAND_PINKY_1")) ParentBoneName = "RIGHT_WRIST"; - else if (BoneName.IsEqual("RIGHT_HAND_PINKY_2")) - ParentBoneName = "RIGHT_HAND_PINKY_1"; - else if (BoneName.IsEqual("RIGHT_HAND_PINKY_3")) - ParentBoneName = "RIGHT_HAND_PINKY_2"; - else if (BoneName.IsEqual("RIGHT_HAND_PINKY_4")) - ParentBoneName = "RIGHT_HAND_PINKY_3"; else if (BoneName.IsEqual("LEFT_HIP")) ParentBoneName = "PELVIS"; else if (BoneName.IsEqual("LEFT_KNEE")) @@ -890,6 +894,7 @@ static FName GetParent70BoneName(FName BoneName) return ParentBoneName; } + static FName GetParentBoneName(FName BoneName, int NbKeypoints = 34) { if (NbKeypoints == 34) @@ -900,12 +905,12 @@ static FName GetParentBoneName(FName BoneName, int NbKeypoints = 34) { return GetParent38BoneName(BoneName); } - else if (NbKeypoints == 70) + /*else if (NbKeypoints == 70) { return GetParent70BoneName(BoneName); - } + }*/ else { - return GetParent34BoneName(BoneName); + return GetParent38BoneName(BoneName); } } diff --git a/Plugins/Stereolabs/Source/ZED/Public/Utilities/ZEDFunctionLibrary.h b/Plugins/Stereolabs/Source/ZED/Public/Utilities/ZEDFunctionLibrary.h index d347cb82..0f59406a 100644 --- a/Plugins/Stereolabs/Source/ZED/Public/Utilities/ZEDFunctionLibrary.h +++ b/Plugins/Stereolabs/Source/ZED/Public/Utilities/ZEDFunctionLibrary.h @@ -123,6 +123,7 @@ static TArray Body38Bones = TArray{ FSlBody38Bone(ESlBody38Parts::RIGHT_ANKLE, ESlBody38Parts::RIGHT_SMALL_TOE) }; +#if 0 static TArray Body70Bones = TArray{ FSlBody70Bone(ESlBody70Parts::PELVIS, ESlBody70Parts::SPINE_1), FSlBody70Bone(ESlBody70Parts::SPINE_1, ESlBody70Parts::SPINE_2), @@ -196,6 +197,8 @@ static TArray Body70Bones = TArray{ FSlBody70Bone(ESlBody70Parts::RIGHT_ANKLE, ESlBody70Parts::RIGHT_SMALL_TOE) }; +#endif + UCLASS() class ZED_API UZEDFunctionLibrary : public UBlueprintFunctionLibrary { @@ -663,12 +666,15 @@ class ZED_API UZEDFunctionLibrary : public UBlueprintFunctionLibrary return Body38Bones; } +#if 0 UFUNCTION(BlueprintPure, meta = (DisplayName = "GetBody70Bones", Keywords = "GetBody70Bones"), Category = "Stereolabs|Zed") static const TArray GetBody70Bones() { return Body70Bones; } +#endif + UFUNCTION(BlueprintPure, meta = (DisplayName = "GetBody34Bones", Keywords = "GetBody34Bones"), Category = "Stereolabs|Zed") static const TArray GetBody34Bones() {