// Copyright Epic Games, Inc. All Rights Reserved. #include "MoverCVDSimDataComponent.h" #include "ChaosVDRecording.h" #include "ChaosVDScene.h" #include "MoverCVDDataWrappers.h" #include "Actors/ChaosVDDataContainerBaseActor.h" #include "MoverCVDTab.h" #include "MoverSimulationTypes.h" #include "ChaosVisualDebugger/MoverCVDRuntimeTrace.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(MoverCVDSimDataComponent) void UMoverCVDSimDataComponent::UpdateFromSolverFrameData(const FChaosVDSolverFrameData& InSolverFrameData) { Super::UpdateFromSolverFrameData(InSolverFrameData); if (TSharedPtr SimDataContainer = InSolverFrameData.GetCustomData().GetData()) { if (const TArray>* RecordedData = SimDataContainer->SimDataBySolverID.Find(SolverID)) { // Load the recorded data into the Physics Mover CVD component FrameSimDataArray.Reset(RecordedData->Num()); FrameSimDataArray = *RecordedData; // Also, clear all cached deserialized data, we're starting from scratch at a new frame DeserializedStates.Empty(); } } } void UMoverCVDSimDataComponent::ClearData() { FrameSimDataArray.Reset(); } bool UMoverCVDSimDataComponent::FindAndUnwrapSimDataForParticle(uint32 ParticleID, TSharedPtr& OutSimDataWrapper, TSharedPtr& OutSyncState, TSharedPtr& OutInputCmd, TSharedPtr& OutLocalSimData) { // Look for a sim data corresponding to ParticleID TSharedPtr* FoundSimData = FrameSimDataArray.FindByPredicate ( [&](const TSharedPtr& SimData) { return (SimData->HasValidData() && (SimData->ParticleID == ParticleID)); } ); if (!FoundSimData || !*FoundSimData) { return false; } // We use the data wrapper pointer as key in the arrays of deserialized structs (input command, sync state) FMoverCVDSimDataWrapper* SimDataPtr = (*FoundSimData).Get(); OutSimDataWrapper = *FoundSimData; // Did we previously deserialize? TSharedPtr DeserializedMoverStates = DeserializedStates.FindOrAdd(SimDataPtr); if (!DeserializedMoverStates) { DeserializedMoverStates = MakeShared(); // This means that the SimData wasn't deserialized yet, so we do it now // Otherwise we use the cached version UE::MoverUtils::FMoverCVDRuntimeTrace::UnwrapSimData(*SimDataPtr, DeserializedMoverStates->InputCommand, DeserializedMoverStates->SyncState, DeserializedMoverStates->LocalSimData); } if (DeserializedMoverStates) { OutSyncState = DeserializedMoverStates->SyncState; OutInputCmd = DeserializedMoverStates->InputCommand; OutLocalSimData = DeserializedMoverStates->LocalSimData; } return true; }