Forráskód Böngészése

[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.

badlogic 6 éve
szülő
commit
bf0999e202

+ 11 - 12
spine-ue4/Config/DefaultEngine.ini

@@ -7,9 +7,15 @@ DefaultGraphicsPerformance=Maximum
 AppliedDefaultGraphicsPerformance=Maximum
 AppliedDefaultGraphicsPerformance=Maximum
 
 
 [/Script/EngineSettings.GameMapsSettings]
 [/Script/EngineSettings.GameMapsSettings]
-GameDefaultMap=/Game/Test/Test.Test
+GameDefaultMap=/Game/Test/NewWorld.NewWorld
 GlobalDefaultGameMode=/Game/Test/Blueprints/TouchClick.TouchClick_C
 GlobalDefaultGameMode=/Game/Test/Blueprints/TouchClick.TouchClick_C
 
 
+[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
+bSupportsPortraitOrientation=False
+bSupportsUpsideDownOrientation=False
+bSupportsLandscapeLeftOrientation=True
+PreferredLandscapeOrientation=LandscapeLeft
+
 [/Script/Engine.PhysicsSettings]
 [/Script/Engine.PhysicsSettings]
 DefaultGravityZ=-980.000000
 DefaultGravityZ=-980.000000
 DefaultTerminalVelocity=4000.000000
 DefaultTerminalVelocity=4000.000000
@@ -17,12 +23,12 @@ DefaultFluidFriction=0.300000
 SimulateScratchMemorySize=262144
 SimulateScratchMemorySize=262144
 RagdollAggregateThreshold=4
 RagdollAggregateThreshold=4
 TriangleMeshTriangleMinAreaThreshold=5.000000
 TriangleMeshTriangleMinAreaThreshold=5.000000
-bEnableAsyncScene=False
 bEnableShapeSharing=False
 bEnableShapeSharing=False
 bEnablePCM=True
 bEnablePCM=True
 bEnableStabilization=False
 bEnableStabilization=False
 bWarnMissingLocks=True
 bWarnMissingLocks=True
 bEnable2DPhysics=False
 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
 LockedAxis=Invalid
 DefaultDegreesOfFreedom=Full3D
 DefaultDegreesOfFreedom=Full3D
 BounceThresholdVelocity=200.000000
 BounceThresholdVelocity=200.000000
@@ -39,6 +45,8 @@ bDefaultHasComplexCollision=True
 bSuppressFaceRemapTable=False
 bSuppressFaceRemapTable=False
 bSupportUVFromHitResults=False
 bSupportUVFromHitResults=False
 bDisableActiveActors=False
 bDisableActiveActors=False
+bDisableKinematicStaticPairs=False
+bDisableKinematicKinematicPairs=False
 bDisableCCD=False
 bDisableCCD=False
 bEnableEnhancedDeterminism=False
 bEnableEnhancedDeterminism=False
 MaxPhysicsDeltaTime=0.033333
 MaxPhysicsDeltaTime=0.033333
@@ -47,16 +55,7 @@ bSubsteppingAsync=False
 MaxSubstepDeltaTime=0.016667
 MaxSubstepDeltaTime=0.016667
 MaxSubsteps=6
 MaxSubsteps=6
 SyncSceneSmoothingFactor=0.000000
 SyncSceneSmoothingFactor=0.000000
-AsyncSceneSmoothingFactor=0.990000
 InitialAverageFrameRate=0.016667
 InitialAverageFrameRate=0.016667
 PhysXTreeRebuildRate=10
 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)
 
 

BIN
spine-ue4/Content/Test/raptor-widget.uasset


+ 46 - 7
spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpineWidget.cpp

@@ -38,7 +38,41 @@
 
 
 using namespace spine;
 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) {
 USpineWidget::USpineWidget(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer) {
 	static ConstructorHelpers::FObjectFinder<UMaterialInterface> NormalMaterialRef(TEXT("/SpinePlugin/UI_SpineUnlitNormalMaterial"));
 	static ConstructorHelpers::FObjectFinder<UMaterialInterface> NormalMaterialRef(TEXT("/SpinePlugin/UI_SpineUnlitNormalMaterial"));
@@ -130,7 +164,7 @@ void USpineWidget::CheckState() {
 				AnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas());
 				AnimationStateData* stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas());
 				state = new (__FILE__, __LINE__) AnimationState(stateData);
 				state = new (__FILE__, __LINE__) AnimationState(stateData);
 				state->setRendererObject((void*)this);
 				state->setRendererObject((void*)this);
-				state->setListener(callback);
+				state->setListener(callbackWidget);
 				trackEntries.Empty();
 				trackEntries.Empty();
 			}
 			}
 		}
 		}
@@ -355,7 +389,8 @@ UTrackEntry* USpineWidget::SetAnimation(int trackIndex, FString animationName, b
 		trackEntries.Add(uEntry);
 		trackEntries.Add(uEntry);
 		return uEntry;
 		return uEntry;
 	}
 	}
-	else return NewObject<UTrackEntry>();
+	else
+		return NewObject<UTrackEntry>();
 
 
 }
 }
 
 
@@ -370,7 +405,8 @@ UTrackEntry* USpineWidget::AddAnimation(int trackIndex, FString animationName, b
 		trackEntries.Add(uEntry);
 		trackEntries.Add(uEntry);
 		return uEntry;
 		return uEntry;
 	}
 	}
-	else return NewObject<UTrackEntry>();
+	else
+		return NewObject<UTrackEntry>();
 }
 }
 
 
 UTrackEntry* USpineWidget::SetEmptyAnimation(int trackIndex, float mixDuration) {
 UTrackEntry* USpineWidget::SetEmptyAnimation(int trackIndex, float mixDuration) {
@@ -382,7 +418,8 @@ UTrackEntry* USpineWidget::SetEmptyAnimation(int trackIndex, float mixDuration)
 		trackEntries.Add(uEntry);
 		trackEntries.Add(uEntry);
 		return uEntry;
 		return uEntry;
 	}
 	}
-	else return NewObject<UTrackEntry>();
+	else
+		return NewObject<UTrackEntry>();
 }
 }
 
 
 UTrackEntry* USpineWidget::AddEmptyAnimation(int trackIndex, float mixDuration, float delay) {
 UTrackEntry* USpineWidget::AddEmptyAnimation(int trackIndex, float mixDuration, float delay) {
@@ -394,7 +431,8 @@ UTrackEntry* USpineWidget::AddEmptyAnimation(int trackIndex, float mixDuration,
 		trackEntries.Add(uEntry);
 		trackEntries.Add(uEntry);
 		return uEntry;
 		return uEntry;
 	}
 	}
-	else return NewObject<UTrackEntry>();
+	else
+		return NewObject<UTrackEntry>();
 }
 }
 
 
 UTrackEntry* USpineWidget::GetCurrent(int trackIndex) {
 UTrackEntry* USpineWidget::GetCurrent(int trackIndex) {
@@ -411,7 +449,8 @@ UTrackEntry* USpineWidget::GetCurrent(int trackIndex) {
 			return uEntry;
 			return uEntry;
 		}
 		}
 	}
 	}
-	else return NewObject<UTrackEntry>();
+	else
+		return NewObject<UTrackEntry>();
 }
 }
 
 
 void USpineWidget::ClearTracks() {
 void USpineWidget::ClearTracks() {