From bf0999e202c9bb1320dc3a81223c74ec626854db Mon Sep 17 00:00:00 2001 From: badlogic Date: Fri, 12 Apr 2019 16:17:11 +0200 Subject: [PATCH] [ue4] Fix crash related to multi-cast delegates. Re-used the event callback for SkeletonAnimationComponent. That cast the rendering object to that class, when the class is really SpineWidget. Lead to various mystery crashes. --- spine-ue4/Config/DefaultEngine.ini | 23 ++++---- spine-ue4/Content/Test/raptor-widget.uasset | Bin 33646 -> 36656 bytes .../SpinePlugin/Private/SpineWidget.cpp | 53 +++++++++++++++--- 3 files changed, 57 insertions(+), 19 deletions(-) diff --git a/spine-ue4/Config/DefaultEngine.ini b/spine-ue4/Config/DefaultEngine.ini index 380efca92..6c63e6306 100644 --- a/spine-ue4/Config/DefaultEngine.ini +++ b/spine-ue4/Config/DefaultEngine.ini @@ -7,9 +7,15 @@ DefaultGraphicsPerformance=Maximum AppliedDefaultGraphicsPerformance=Maximum [/Script/EngineSettings.GameMapsSettings] -GameDefaultMap=/Game/Test/Test.Test +GameDefaultMap=/Game/Test/NewWorld.NewWorld GlobalDefaultGameMode=/Game/Test/Blueprints/TouchClick.TouchClick_C +[/Script/IOSRuntimeSettings.IOSRuntimeSettings] +bSupportsPortraitOrientation=False +bSupportsUpsideDownOrientation=False +bSupportsLandscapeLeftOrientation=True +PreferredLandscapeOrientation=LandscapeLeft + [/Script/Engine.PhysicsSettings] DefaultGravityZ=-980.000000 DefaultTerminalVelocity=4000.000000 @@ -17,12 +23,12 @@ DefaultFluidFriction=0.300000 SimulateScratchMemorySize=262144 RagdollAggregateThreshold=4 TriangleMeshTriangleMinAreaThreshold=5.000000 -bEnableAsyncScene=False bEnableShapeSharing=False bEnablePCM=True bEnableStabilization=False bWarnMissingLocks=True bEnable2DPhysics=False +PhysicErrorCorrection=(PingExtrapolation=0.100000,PingLimit=100.000000,ErrorPerLinearDifference=1.000000,ErrorPerAngularDifference=1.000000,MaxRestoredStateError=1.000000,MaxLinearHardSnapDistance=400.000000,PositionLerp=0.000000,AngleLerp=0.400000,LinearVelocityCoefficient=100.000000,AngularVelocityCoefficient=10.000000,ErrorAccumulationSeconds=0.500000,ErrorAccumulationDistanceSq=15.000000,ErrorAccumulationSimilarity=100.000000) LockedAxis=Invalid DefaultDegreesOfFreedom=Full3D BounceThresholdVelocity=200.000000 @@ -39,6 +45,8 @@ bDefaultHasComplexCollision=True bSuppressFaceRemapTable=False bSupportUVFromHitResults=False bDisableActiveActors=False +bDisableKinematicStaticPairs=False +bDisableKinematicKinematicPairs=False bDisableCCD=False bEnableEnhancedDeterminism=False MaxPhysicsDeltaTime=0.033333 @@ -47,16 +55,7 @@ bSubsteppingAsync=False MaxSubstepDeltaTime=0.016667 MaxSubsteps=6 SyncSceneSmoothingFactor=0.000000 -AsyncSceneSmoothingFactor=0.990000 InitialAverageFrameRate=0.016667 PhysXTreeRebuildRate=10 - - - - -[/Script/IOSRuntimeSettings.IOSRuntimeSettings] -bSupportsPortraitOrientation=False -bSupportsUpsideDownOrientation=False -bSupportsLandscapeLeftOrientation=True -PreferredLandscapeOrientation=LandscapeLeft +DefaultBroadphaseSettings=(bUseMBPOnClient=False,bUseMBPOnServer=False,MBPBounds=(Min=(X=0.000000,Y=0.000000,Z=0.000000),Max=(X=0.000000,Y=0.000000,Z=0.000000),IsValid=0),MBPNumSubdivs=2) diff --git a/spine-ue4/Content/Test/raptor-widget.uasset b/spine-ue4/Content/Test/raptor-widget.uasset index 04c8fd39050907c7529e4a62940c114b36fa2126..bc990b2e0b78d31a96958283afc2ccf8dcfa4d94 100644 GIT binary patch delta 5652 zcmcIodr*|u6~7nRxC^WM=`OqMF33Z~MK+3J1jWc>RRSS`fPfDaTv;9>3oO1(z(hX>IXVYdrgKA%}JJ`>@KhoAd?l2U^+svq|>g;K2?bi^SFSK^N*7U9c+?Etx zb2^DXO8OIA*BIMr?dpQR7S`_Saw9Afx1;bdTS}hR@ zGMwCLCyZFFrE+SWf=ObUs85ASos^xBKHJSZVdZT1^2k1>$LPa28H2O4-Gc{(mb~3F zi6OC%5%UR5j&MY@KSiu}5_U8K>l1Z3`lx76pdF^@GPP+E%5MotQCuME(r`?)Zy`1Y zEmntpL}(~`vqZhR9!f*GaM9&}>sG}+Ak;KK8u74%!jwCGMkux!?H&zbi&1VC^>Z84 zo|M$Nt~gX3!>0nD$iePw6dG)Ll48#nmPAPx^;r%2e1b@MK7w*V)E9>-6ArV1UaWQS zz+rR6YodM{RyynK zFNqe}q>Fm>CVd@)PP2mip`3O_EN3>U!&bYLq!+O%XLXC*jO8ZW zan;$Yutt5+eDlS7cqIULU9~DCjYg@0<>O8rA~IQ>7H{UBZgsfE6vbYHYT4;kVHw{C zFQ?SncOpcEvyl=`YKK*eV!PQztEm=h z8dIjp-^0CZo1@tK1tk&X`(jG2*Rhuc@Pj!XyL`n=c#bp(>dn*R_vieD^Pi6YKK;{l zn4jYULs=GlQkn^;@{LeeR>rF#Jtqf#UgpBxJv}D_npYZOnlG8JhpVL-@Vw8=YgPSD zpTg_Z+5|GbdA(3&diKMl+sd9$E_b8Y;fp3_+ey+73MbVvwG~C z;uGum5E_W$hbs+^L}|;>vuHU(w(qEYec8~6`l`m|_PeGt`@LN7e%z! zkdso!Z@lv5PmWerzIpw!CAVr#W#p)8Xd{vU1Dhf7(n-Cp741!`>ogzlIPr3 zL6XtdUlch;iy+YPO-1*ef@#~T>D06R5%3~sF1AgeQ!W~+H!GNfEt`w@O1Ro;PhdrY zj)`tfMyNF81-_+&pG4SUdK|5Si&i5%+~VPfAicTKL|1q!ei&+&_KE%yFl_bkXJO&i zOw%fjfDCPf5vvDUf_76$zDOfO8~)SLcOrmsz*zqlj78(?}{ zcBH%E;*NL-v~}>^aJ{WEQxBuC|0`yzsA_^TgJK`=EEIZ~V2|W~an#Vzmqpb4mj?nK zPF)$0((Z!lF5@gY!Xxi3w6~MD_q7+fJ0fPN&X#+HhVsg0pdo`|-bN_u@VHMtW)UsJ z?{#>1CD=Oi9&y_K&NW}j`m^6UU;vIyl|t>3b(sFPvwbh-4nw* zpUx9ruy&VxCF_+J11;X#dhd6~T5r`ZT5t2Nr;GY)>RLbQF+)~Q)>B2@3*YVO;LR{A zSZ{h&k48^W+taFm`kDx4@p6doEswINZFGJ^Sjx=xiMDz+xT2>2G4S?fY<}XtG!$#| zFF`Q&HuXWDmNG@|V>m5&v}iAm{{Ba7R$BhOm!7uN}kPucP4akjegr9MiN{I zrI>73!>O=bxD!ft{N%o&)=x4^YSIs6p7 zzwZ|Cy=izO&)931+VPQtW)403blQ0Lz-XL-J`4Vb9!BDLBBTvu>Z5cIpeh0WwI_3m z;khZ2i}U=0iB4yI4*!oejl>zqM_q7u(2H4**UW7)IcQ_n;(@0na;WIHgWCwcqUjz7 zKSXez0A+s4opl49!z)(W4;M2wq(6hvx}pil2@yw~qJCSYo3A_+Dxh`9Hu#+ANambA z;bb#o!vb6?q*2J_Lh7IXuM5R-A?fQuEz|M0&fnkJJHW<->JitdH;`0Bc1?wnj!ufN z3s7Dr;0m6!1SF4=sMpp0=KW^8VJ|4z^FFhYjT9zextm@(MD4`Rjwjzt}HW7-6;OaroVD wy~Q%1WdaOP=-}NWnNiN+e;iTtkdw(?-7fX0cb*J@>MwHXZFzp?SMoV@IvH}m(sC#OY`J`SIgLO{4ogb11Gyn?v)0TlX;hd44u z*UEE~Mw3EvgGYPKXF_Bty{_z7rwDLLjH!BR|o@{kydX$hjkC7yOaQCNp!*W- zlAfUJe1Z;rVqtNp1zTZ{HQMZ(g+{q^TG@d=&OrF-X!mFsI%tS;%U0MK<@WmfFzGNK zj^{+okLh;soC@3#Kz9Rmg{+&*w4dos)NK*Mt4)=1kDs!Oc@-4!{4+F6W?lvL3eRc( z=upy7c0bpr;wtJC|26WuI97-t0kPU#HhGpexU>Coj0hcBWXwrwn?HK!8}N4XDD zZgtpZ=~9u2w2t}iHHMdhIID{m+l$W%eEb*tvk#UK@j`kb^N{@R2RdHt6T6mic>+z!Lw(b)_uT z$tSOi8NRZ{h>yI!Y7euimw;fU4BPL6J+M1$R4W<;Q7K&XK|GH1pu072)KMKd2@$mK z=>)~G6owo{kmIz(EYt;>_B`_)(BQ1Jt>PJ(#513<&WKaG9JZ2iAkX+9Z3v;z$pfuk z!tYz>It;21u1AMCBT!5bDhxrc($?S@g>PMzww1^!_GhOYMlY*j6J_IU8Zi8{P2B*a};l=0=YqHcX!k_h^Hm=O)ad>AoAK~Uw8FKbP+6^eSZsob;&54`&GL(*WG$^RdbaqjDRL3KP?-;>%B;wZlqJb* z=wFru|1GPKIncc_4yLZ&fX~&GY%v$lZaO~mL>B%o#wQyag_12$GUzT#gRau>v}`fo z(E2Qh)4doLVgX#L$cbKPXcU@ayDU9WR%MUza6Pa4b-`xXU9~*-7;BoD@`=(9(QqIo zonH?;tXkw%eTXE33^yZH?|&%r>LsVmw>VxC|Hde&Nz%X$Yz!483FwHcwtRpQbnIxT z4-T?$$Qo`|c2*d!vg0CZ?t$BD>{Hc@4zmZk*Vzrc2j*2Dik@X#7d)j>_V<%(ZFt~P zwS9`RlUPHvGW`5i^JA;2LHU-N9Q=KwW`&OVvCrlO_BEBMioF@qYg3K=AY}z34#4Kx zaWPFTZgA zy@ArwlNVo)NL#h6)PGTJ3;i}4H!wlzmpFVdWO$u=Hd=*K?_fs-3HR{9C^k zpz>V+vl^0RI+QgenxEp(eXG0SY{PH0IP_@Tlj&>NyR8pSug`WaWxPuDdsTjyT9j$P z%9r7HCSc|J(R!lF!@G?Z%;isw6IFYgr}4>^PJzY^$=|2iZE^@sG$omzR!JNC?1l$T zN6Z7`$S*W+lvR-0GShz_V1G-8?18UZO2=&VSNI;X8=dG|eWyOjxrpTxZP-YMH8J3; zqT0U)%G(nlzt!aoSa`|~UTUSPpK8r@Z}baG3sI)A!~=I*9kNq9?|14`pkY(8`^7Qn z@sE89gtsNj6|ksn?jsfYMcc9;CSmpM(-Y3?G~wTsVU^80!q|X4o6OnJeyW!)%d|XoShu?_>TjR?fc;Nol+$?n;r%?6x<2$zTp>2D# zZZvO9GvK>9Cyzumg9N&$82e*E?@W=0M%QmY9t5xTO~*U?Aklq>AN{t1J9|$nwbF d0DXoHUajHYkRwUeT`Lt;^YLr-`GM5a{{yDOoDl#3 diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp index a7abb9865..94d1a824f 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp @@ -38,7 +38,41 @@ using namespace spine; -void callback(AnimationState* state, spine::EventType type, TrackEntry* entry, Event* event); +void callbackWidget(AnimationState* state, spine::EventType type, TrackEntry* entry, Event* event) { + USpineWidget* component = (USpineWidget*)state->getRendererObject(); + + if (entry->getRendererObject()) { + UTrackEntry* uEntry = (UTrackEntry*)entry->getRendererObject(); + if (type == EventType_Start) { + component->AnimationStart.Broadcast(uEntry); + uEntry->AnimationStart.Broadcast(uEntry); + } + else if (type == EventType_Interrupt) { + component->AnimationInterrupt.Broadcast(uEntry); + uEntry->AnimationInterrupt.Broadcast(uEntry); + } + else if (type == EventType_Event) { + FSpineEvent evt; + evt.SetEvent(event); + component->AnimationEvent.Broadcast(uEntry, evt); + uEntry->AnimationEvent.Broadcast(uEntry, evt); + } + else if (type == EventType_Complete) { + component->AnimationComplete.Broadcast(uEntry); + uEntry->AnimationComplete.Broadcast(uEntry); + } + else if (type == EventType_End) { + component->AnimationEnd.Broadcast(uEntry); + uEntry->AnimationEnd.Broadcast(uEntry); + } + else if (type == EventType_Dispose) { + component->AnimationDispose.Broadcast(uEntry); + uEntry->AnimationDispose.Broadcast(uEntry); + uEntry->SetTrackEntry(nullptr); + component->GCTrackEntry(uEntry); + } + } +} USpineWidget::USpineWidget(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer) { static ConstructorHelpers::FObjectFinder NormalMaterialRef(TEXT("/SpinePlugin/UI_SpineUnlitNormalMaterial")); @@ -130,7 +164,7 @@ void USpineWidget::CheckState() { AnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas()); state = new (__FILE__, __LINE__) AnimationState(stateData); state->setRendererObject((void*)this); - state->setListener(callback); + state->setListener(callbackWidget); trackEntries.Empty(); } } @@ -355,7 +389,8 @@ UTrackEntry* USpineWidget::SetAnimation(int trackIndex, FString animationName, b trackEntries.Add(uEntry); return uEntry; } - else return NewObject(); + else + return NewObject(); } @@ -370,7 +405,8 @@ UTrackEntry* USpineWidget::AddAnimation(int trackIndex, FString animationName, b trackEntries.Add(uEntry); return uEntry; } - else return NewObject(); + else + return NewObject(); } UTrackEntry* USpineWidget::SetEmptyAnimation(int trackIndex, float mixDuration) { @@ -382,7 +418,8 @@ UTrackEntry* USpineWidget::SetEmptyAnimation(int trackIndex, float mixDuration) trackEntries.Add(uEntry); return uEntry; } - else return NewObject(); + else + return NewObject(); } UTrackEntry* USpineWidget::AddEmptyAnimation(int trackIndex, float mixDuration, float delay) { @@ -394,7 +431,8 @@ UTrackEntry* USpineWidget::AddEmptyAnimation(int trackIndex, float mixDuration, trackEntries.Add(uEntry); return uEntry; } - else return NewObject(); + else + return NewObject(); } UTrackEntry* USpineWidget::GetCurrent(int trackIndex) { @@ -411,7 +449,8 @@ UTrackEntry* USpineWidget::GetCurrent(int trackIndex) { return uEntry; } } - else return NewObject(); + else + return NewObject(); } void USpineWidget::ClearTracks() {