From 08db67ba1c9800a09bf3d1a637b56e7e0e860f0b Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 7 Dec 2016 16:47:07 +0100 Subject: [PATCH] [ue4] Trying to get events working on UTrackEntry wrappers --- spine-ue4/Content/Maps/example.umap | Bin 630117 -> 629991 bytes .../SpineSkeletonAnimationComponent.cpp | 32 +++++++++++------- .../Public/SpineSkeletonAnimationComponent.h | 14 ++++++-- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/spine-ue4/Content/Maps/example.umap b/spine-ue4/Content/Maps/example.umap index 15d9a8aae546112c1f6f57e764403ec77b049a6e..4af6b28c73c0940a855edf079d14a0fd0169207d 100644 GIT binary patch delta 14240 zcmeHN33yc16~4nHFarT6$q+ISAPJDLg+MR?Swjc`WL1=X3lK;!Bw<&yolp>npaQp; z)=CB2+KO9ZV%b~>O9TX2Qf;-h1Q*1wRYXCk73n$mo%3dRZ3v*UUS5h{cjSy+$*RXx$vB1AGgA<#P&BSaUdC$tx0DAZG8p-zPc zlnp(E*o;r_xn~YcOB%Fx!{wR_GY+4CscH`L2@#EfW5fmrG32Y)bLca16X9{%+6k%zi4Q|!bRByGjl}Q&{n%D8a9fzSX^>$Sc{5T zVVfIO#79@#+$a#s*H^DzZK^eeoodET2EeKSi!jVP)+M;nbA1@6(B zKC!(4uwwzR8XuUl9|eBl1H>W3E(E|FxXz*YG9tncwjX%juT2|knz#?Zk2KIHb~XU^ z55{D-_(=O5-aU6DDZ~4Y*9jUpjwl)9b%L2}BVi4xCdCCBG2Sq5Gxd)E7JjX~TLgoL z0sNI=;;*S+4cKGUW{=9PL!70xCDxGAl19)d=r|_Xw7%6k#?T5 zTb@X0fq1nwa$};Rya<#rTJy>^lmikK<$(r~vPi>2Ln7t6M4NjLX@V}AKy7vrFSJX5 zVY?nYM(j(#ruvz89I!)#HKLlsj`Pk4AulDyB{9#>iRKVse>L#rwR=ETwTm3Vs}(iF zHs(g=!q_grE*iLeL;cqPJ5BBLvZ{THdT~8Vs~)h%%h-;Nrs!cl_-t@AcYyv3Ij=(} zS=+(ZG}3^g^=oysCG`04YC*gYl$MNOxu$B%G@$y7%KI4yi z;T-`#I+;~y^*&kB5l9|~2Nw#Ku?>W{G}T1b79b?Uy@sVes6ApflgTYz!y+&sSWwxA z;2AUL8W>MQaHN7?fcmrs%i6Bah&|B9f>U3EN9L-jvZ$LD>%B0Bk`c%2?8H1X4tguR zD+rmZ;ppno;A-5?hv312(FlY3(RsRdNYVs`a9wa21&t@KB|#TVVH|2Cxu}uIvhG?y zYG8~5k_s-(EYK8PpW=*okLIEgweZ|iq+ziz7kPgO50|^4F=4*0VNrKY!w(2Y7OC)@ z&`4x)l0%+Nanwh@)?c8pO}|<5-BPbPdC=ZL_;JA7L!YxGI_5KoYTQC?KH}(=w`o3B zYr&-O#U4Bf#=Pgxg#KeoS?yNu&>F+3i|_{u9tB19g}ADbl@>o}v9)^JYg^%+0>r3T z?t?SA@TWSz8Y083fu}wEQw8IhQo>}iEHyS94|WVhI6PONT_sPa4sMIrY#zOgqtw3$ zHD2rST$1T&Hz$1o4ZN?TBA-KzgwRxqAp_Wps(k{+Ps*)nqZ+?K)JLJ-F0Z5|=NzMv zSD?nj5P9u^8jme(zX~-9L@RLd!nzfS@U(*`9v;My?q#Bbrg{a%jnEt(qBN`2g|mc+d~nL|sliUXJh8ww<>j)ijTt zhpQP&BYC1qfMI;a)_!Lpu67C*Hz6s&&!` z7{Ek?#VA4uWQ4_x=srUBY3npH-7)UO?`XeWb+6-@%Zo-&A;h1gGy88A|#}^Y_CU82{+RmOkFHAny|MtFnX_Q$Vz|01P zX9+kh1rzb$dLokNC%Rls49Ymwd?D7z!t|KIGq^{!9%GzULW3L;UVHjltK!)bHi%mv z_A8Re)e(Rx6ZOQ?4UM>NO^^wi1**gcS4BQP;QO>5{TvDp1?PWm{jrSi(|QaP#ven5 zp16^*_bkJ;z!{5a`EpY6-m|LTb#TnjVflD#FS z6H{YuvWOFesI}Z&Nb2(T#+Mu{%kXrSwm}a2Ds4b4k#U2Zu4?KrJttO`S=t=T5Msza zQQRc+H9vHRk#FOo-CtELeKI^_eX|jJD=W$dwXh@@EcF-~3!FTLp3mxNsnotxm8FK@ zjZ~E550o7;eXw) z3CuKpHD5@8uv0GKH5NsH$ybFv&olxb2R$q?Rm|Kg zW$ctr|K$*!nex4dXt*+;UH9!ngo$yq=0lMptERf#W>*Fe)b+%Pglm;m$O+S8?s$a; zO)CoDZ{Hx0Zz|L162jY1C3_~~!H!m$eqZZxFVWlzs@ZX(m^+LSR|a$Wjj0-33U z`pZhIHaAF&(C-4e6xn!2v|VS37l!6Rm~=NYAtAb|{OaK03$GBaz`E6eEx(_5*rK{3 zFkfFbx11fFrZXYs^~5DaasR+9rw8}IdE)9<%F!c7`UaLVSeMe67B4TSb;jj{S&WG| z^5cjo3=?@TJ>JGptv4vj(|O_iLY)-5W;%j|Z=kNNUr}GxK~!@&XI7Kz7v-*lsA%cP zxdB!=DL5Qy-wxb;BSa0WlU1{42eT?yj}@Pf$k=a2!!LCf!xH2mv$g8-&O|)8T5d^o z%6I#P`A=%+3?}WMzP=l`gYdxnB+92Xm9TDG$WP`>ZQ3^c)4crMk7Yekv#wxTp1m_l zfGZiK!_vc{Aq}N9H&&MCws*w6x1jM;doK^zSt4=^&dxp{KhAAG-AVeG^g;!P`U7#J z-s2C%54$l8%K3Rt`$4_;P+pAXl6*QZuBCTmyxT}xDL>A;*UqEI6)BpI1< z^P1?mzfmvnwK%5m`mV*R3cu@}D;D(ozql6TE&DcdmN~M)Z(G-QEk0h9+{(1!5<#60 zNu?bd=Q{^Z;SSY$%E0@)zNLJDp4YQQ^Aoa=F%~{u`Q&2_)R!6LiG=Oo@m{Y?{DQ2V zAMIAT1t@OtrU<%|=73Bnp4WZs?ZY1^Y=`b2d<)&BAdk_!Ihk1HbNuLy4;BV=F6a@1 zo%+s(*+F&owfiq9Q9guq06-6^oV+k*#3drdKPaezuL)WCg@p^QiO=VRn$*WX1${~2 zrHTU!8(Cakse74fv=EE>a^Jg^)-feI&w8jP3ZC!%t-%#mymG$~Cm|?X22{%I#a-NW z3V{oFw)G>~;y*ZXFvSoYVuGL9RBUFzKqd`x^z{I8a2nR-*k>ZPdo^)=6R(creosA9 z1m1%PJV~JGWrv;fJ0f7-yx+9tZ@bJ;80jm^+*J*+O(>C0^4jCik=Xj!%_%r#i!r!!=V!+3RRYac}L z61n~!XYV1@OQG6Rak9#yp&zKgcIWHevOjT4c*fxB9s~Wl7Q-@Y!8mJr?u1a4K6NjX z_w?*1(qpo&&*}IV%Z5RsJpMb$x9GbfP|$yrAKd@$>-0ZwK3qNg2@=~6;SUsJ{>|5h z;s2UyjsD^%G{R}7EuD9~jnz5LL_B!TuFd)>uIJG<%HgK(MNN`Y`t~LM=ESj|5N0}- z*8VfdH0?N{YpB*YMrV-rTf@{8t2Xc(oa(Aa`Y>Y~QR6phmz;io1GkkZG6`Xd1=JTI zL~t(+m`sCjIO&+Qu^3IWh)x<{LbU(=r#|JwUk_GAwiP}6Qoc?I5<1)T^GkQin@&z& zZX0COM~LozXJ-@Q*H^9=gHk*fl;TKGirN4a(QzAU^0)0tJtc|)P^rkeb_SzxZy^d} z?B~(Ac!CSpbgM=Dfe@do<38V@dNtUR@pD4g$nq6V`TRM_i-Ws9}Jk1k?+?IS(dK>DRO}#>hX*=RZ`Inby=#k*%h=GR@2M zmxLP`7SOmTq{iQ=R)17>3;#QrH|R8);3JiMl{wu%I3(kF7DYAfZ0&FUihTz_4idV< xNQFn0=X1sKk~WQ5C8VreQC_mTyu<=eJ$S6}guoLDPkneAz+>B9USh9|{12g;{m1|S delta 14062 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 - component->SpineAnimationStartEvent.Broadcast(231); + if (type == SP_ANIMATION_START) { + if (entry->rendererObject) { + UTrackEntry* uEntry = (UTrackEntry*)entry->rendererObject; + component->AnimationStartEvent.Broadcast(uEntry); + uEntry->AnimationStartEvent.Broadcast(uEntry); + } + } } USpineSkeletonAnimationComponent::USpineSkeletonAnimationComponent () { @@ -71,43 +77,43 @@ void USpineSkeletonAnimationComponent::FinishDestroy () { Super::FinishDestroy(); } -UTrackEntry USpineSkeletonAnimationComponent::SetAnimation (int trackIndex, FString animationName, bool loop) { +UTrackEntry* USpineSkeletonAnimationComponent::SetAnimation (int trackIndex, FString animationName, bool loop) { CheckState(); if (state && spSkeletonData_findAnimation(skeleton->data, TCHAR_TO_UTF8(*animationName))) { spTrackEntry* entry = spAnimationState_setAnimationByName(state, trackIndex, TCHAR_TO_UTF8(*animationName), loop ? 1 : 0); - UTrackEntry* uEnty = NewObject(); - uEntry->entry = entry; + UTrackEntry* uEntry = NewObject(); + uEntry->SetTrackEntry(entry); return uEntry; } else return NewObject(); } -UTrackEntry USpineSkeletonAnimationComponent::AddAnimation (int trackIndex, FString animationName, bool loop, float delay) { +UTrackEntry* USpineSkeletonAnimationComponent::AddAnimation (int trackIndex, FString animationName, bool loop, float delay) { CheckState(); if (state && spSkeletonData_findAnimation(skeleton->data, TCHAR_TO_UTF8(*animationName))) { spTrackEntry* entry = spAnimationState_addAnimationByName(state, trackIndex, TCHAR_TO_UTF8(*animationName), loop ? 1 : 0, delay); - UTrackEntry* uEnty = NewObject(); - uEntry->entry = entry; + UTrackEntry* uEntry = NewObject(); + uEntry->SetTrackEntry(entry); return uEntry; } else return NewObject(); } -UTrackEntry USpineSkeletonAnimationComponent::SetEmptyAnimation (int trackIndex, float mixDuration) { +UTrackEntry* USpineSkeletonAnimationComponent::SetEmptyAnimation (int trackIndex, float mixDuration) { CheckState(); if (state) { spTrackEntry* entry = spAnimationState_setEmptyAnimation(state, trackIndex, mixDuration); - UTrackEntry* uEnty = NewObject(); - uEntry->entry = entry; + UTrackEntry* uEntry = NewObject(); + uEntry->SetTrackEntry(entry); return uEntry; } else return NewObject(); } -UTrackEntry USpineSkeletonAnimationComponent::AddEmptyAnimation (int trackIndex, float mixDuration, float delay) { +UTrackEntry* USpineSkeletonAnimationComponent::AddEmptyAnimation (int trackIndex, float mixDuration, float delay) { CheckState(); if (state) { spTrackEntry* entry = spAnimationState_addEmptyAnimation(state, trackIndex, mixDuration, delay); - UTrackEntry* uEnty = NewObject(); - uEntry->entry = entry; + UTrackEntry* uEntry = NewObject(); + uEntry->SetTrackEntry(entry); return uEntry; } else return NewObject(); } diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h index 57f27509f..22b2c50cb 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Public/SpineSkeletonAnimationComponent.h @@ -7,6 +7,8 @@ #include "spine/spine.h" #include "SpineSkeletonAnimationComponent.generated.h" +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSpineAnimationStartEvent, UTrackEntry*, entry); + UCLASS(ClassGroup=(Spine), meta=(BlueprintSpawnableComponent), BlueprintType) class SPINEPLUGIN_API UTrackEntry: public UObject { GENERATED_BODY () @@ -16,12 +18,18 @@ public: UTrackEntry () { } spTrackEntry* entry = nullptr; + + void SetTrackEntry(spTrackEntry* entry) { + this->entry = entry; + entry->rendererObject = (void*)this; + } UFUNCTION(BlueprintCallable, Category="Components|Spine") - int GetTrackIndex() { return entry ? entry->trackIndex : 0; } -}; + int GetTrackIndex() { return entry ? entry->trackIndex : 0; } -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSpineAnimationStartEvent, UTrackEntry*, entry); + UPROPERTY(BlueprintAssignable, Category = "Components|Spine") + FSpineAnimationStartEvent AnimationStartEvent; +}; class USpineAtlasAsset; UCLASS(ClassGroup=(Spine), meta=(BlueprintSpawnableComponent))