You can right click a level asset in the editor's Content Browser and do the action Source Control > Diff against Depot. However, this does not provide a useful diff window. It currently opens the default text diff tool, for example Helix P4 Merge, and always displays the same text content:


Begin Map
   Begin Level
   End Level
Begin Surface
End Surface
End Map  

Users have requested a more useful diff window / level representation here. Consider:

  • A text based presentation of the level asset
  • A blueprint diff of the level blueprint

But this will likely need dev team discussion. This is a feature request, but I'm entering it as a bug to make it public searchable since the Diff against Depot action is exposed for Level assets and users may wonder why it currently does nothing.

A user has suggested as a quick workaround to convert the level to a more useful text format by supplying the "t3d" format instead of "copy" for UWorlds in UAssetToolsImpl::DumpAssetToTempFile.


Steps to Reproduce
  • Open a project with source control enabled
  • Check a level asset (.umap) into source control
  • In the editor, content browser, right click the level: Source Control > Diff against Depot

Observe: It opens P4Merge (or other default text merge) tool with the not-useful contents left and right:

Begin Map
   Begin Level
   End Level
Begin Surface
End Surface
End Map 

Expected: A useful way of diffing level assets.


No crash here, but this the 5.3 callstack for current behavior:
> UnrealEditor-AssetTools.dll!UAssetToolsImpl::DumpAssetToTempFile(UObject * Asset) Line 2897 C++
  UnrealEditor-UnrealEd.dll!UAssetDefinitionDefault::PerformAssetDiff(const FAssetDiffArgs & DiffArgs) Line 34 C++
  UnrealEditor-AssetTools.dll!FAssetDefinitionProxy::PerformAssetDiff(UObject * OldAsset, UObject * NewAsset, const FRevisionInfo & OldRevision, const FRevisionInfo & NewRevision) Line 359 C++
  UnrealEditor-AssetTools.dll!UAssetToolsImpl::DiffAssets(UObject * OldAsset, UObject * NewAsset, const FRevisionInfo & OldRevision, const FRevisionInfo & NewRevision) Line 2866 C++
  UnrealEditor-AssetTools.dll!UAssetToolsImpl::DiffAgainstDepot(UObject * InObject, const FString & InPackagePath, const FString & InPackageName) Line 2824 C++
  UnrealEditor-AssetManagerEditor.dll!FAssetSourceControlContextMenuState::ExecuteSCCDiffAgainstDepot() Line 775 C++
  [Inline Frame] UnrealEditor-AssetManagerEditor.dll!Invoke(void(const FAssetSourceControlContextMenuState::*)()) Line 66 C++
  [Inline Frame] UnrealEditor-AssetManagerEditor.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(void(const FAssetSourceControlContextMenuState::*)() &) Line 311 C++
  UnrealEditor-AssetManagerEditor.dll!TBaseSPMethodDelegateInstance<1,FAssetSourceControlContextMenuState const ,1,void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfSafe() Line 298 C++
  UnrealEditor-Slate.dll!TDelegate<void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfBound<void,0>() Line 570 C++
  [Inline Frame] UnrealEditor-Slate.dll!FUIAction::Execute() Line 139 C++
  UnrealEditor-Slate.dll!SMenuEntryBlock::OnClicked(bool bCheckBoxClicked) Line 1167 C++
  UnrealEditor-Slate.dll!SMenuEntryBlock::OnMenuItemButtonClicked() Line 1118 C++
  [Inline Frame] UnrealEditor-Slate.dll!Invoke(FReply(SMenuEntryBlock::*)()) Line 66 C++
  [Inline Frame] UnrealEditor-Slate.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(FReply(SMenuEntryBlock::*)() &) Line 311 C++
  UnrealEditor-Slate.dll!TBaseSPMethodDelegateInstance<0,SMenuEntryBlock,1,FReply __cdecl(void),FDefaultDelegateUserPolicy>::Execute() Line 281 C++
  UnrealEditor-Slate.dll!TDelegate<FReply __cdecl(void),FDefaultDelegateUserPolicy>::Execute() Line 549 C++
  UnrealEditor-Slate.dll!SButton::ExecuteOnClick() Line 465 C++
  UnrealEditor-Slate.dll!SButton::OnMouseButtonUp(const FGeometry & MyGeometry, const FPointerEvent & MouseEvent) Line 390 C++
  UnrealEditor-Slate.dll!SMenuEntryButton::OnMouseButtonUp(const FGeometry & MyGeometry, const FPointerEvent & MouseEvent) Line 434 C++
  [Inline Frame] UnrealEditor-Slate.dll!FSlateApplication::RoutePointerUpEvent::__l8::<lambda_3>::operator()(const FArrangedWidget &) Line 5220 C++
  UnrealEditor-Slate.dll!FEventRouter::Route<FReply,FEventRouter::FToLeafmostPolicy,FPointerEvent,`FSlateApplication::RoutePointerUpEvent'::`8'::<lambda_3>>(FSlateApplication * ThisApplication, FEventRouter::FToLeafmostPolicy RoutingPolicy, FPointerEvent EventCopy, const FSlateApplication::RoutePointerUpEvent::__l8::<lambda_3> & Lambda, ESlateDebuggingInputEvent DebuggingInputEvent) Line 442 C++
  UnrealEditor-Slate.dll!FSlateApplication::RoutePointerUpEvent(const FWidgetPath & WidgetsUnderPointer, const FPointerEvent & PointerEvent) Line 5206 C++
  UnrealEditor-Slate.dll!FSlateApplication::ProcessMouseButtonUpEvent(const FPointerEvent & MouseEvent) Line 5775 C++
  UnrealEditor-Slate.dll!FSlateApplication::OnMouseUp(const EMouseButtons::Type Button, const UE::Math::TVector2<double> CursorPos) Line 5740 C++
  UnrealEditor-ApplicationCore.dll!FWindowsApplication::ProcessDeferredMessage(const FDeferredWindowsMessage & DeferredMessage) Line 2231 C++
  UnrealEditor-ApplicationCore.dll!FWindowsApplication::DeferMessage(TSharedPtr<FWindowsWindow,1> & NativeWindow, HWND__ * InHWnd, unsigned int InMessage, unsigned __int64 InWParam, __int64 InLParam, int MouseX, int MouseY, unsigned int RawInputFlags) Line 2738 C++
  UnrealEditor-ApplicationCore.dll!FWindowsApplication::ProcessMessage(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 1099 C++
  [Inline Frame] UnrealEditor-ApplicationCore.dll!WindowsApplication_WndProc(HWND__ *) Line 931 C++
  UnrealEditor-ApplicationCore.dll!FWindowsApplication::AppWndProc(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 937 C++
 [External Code]
  [Inline Frame] UnrealEditor-ApplicationCore.dll!WinPumpMessages() Line 119 C++
  UnrealEditor-ApplicationCore.dll!FWindowsPlatformApplicationMisc::PumpMessages(bool bFromMainLoop) Line 148 C++
  UnrealEditor.exe!FEngineLoop::Tick() Line 5749 C++
  [Inline Frame] UnrealEditor.exe!EngineTick() Line 61 C++
  UnrealEditor.exe!GuardedMain(const wchar_t * CmdLine) Line 188 C++
  UnrealEditor.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) Line 247 C++
  UnrealEditor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) Line 298 C++
 [External Code]

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-208637 in the post.

Login to Vote

ComponentUE - World Creation - Worldbuilding Tools
Affects Versions5.3.2
Target Fix5.5
CreatedMar 1, 2024
UpdatedMar 1, 2024
View Jira Issue