CamUEr, an alternative editor viewport camera bookmarking system

What is it?
CamUEr is an Unreal Engine editor plugin that lets you bookmark as many viewport camera locations as you want,
give them names so you can easily remember them and delete them if you no longer need them.

Want to get quick access to your first 12 bookmarks? They all have shortcut keys (Ctrl-F1 through F12) for instant access.

Bookmarks are saved per project and per map, so the next time you open a map, they’ll be right there, waiting for you.

It’s not on the marketplace. Where do I get it?
Go to itch.io or Gumroad.

Still confused? Maybe these demonstrations will help.

Screenshots
camuer1.png
camuer2.png
camuer3.png

Those are… all outside the scope of my plugin, though? I guess I could add number 3, maybe?
You’re better off talking about Epic about those.

This is a cool tool and the price is certainly right. A shame that Epic does not sell that through the marketplace. Anyway, thanks for making this

You’re welcome.

4.13 build up on the itch.io and gumroad marketplaces.

I had it running on 4.14 yesterday and today it would crash the program on start. I didnt download the 4.13 release because I cant find my original download info. Will this new version run on 4.14?

There’s a 4.14 build on both marketplaces that should work.
Crashing on start is a new one.
Do you have a crash log for it (or can you repeat it and get the crash log?)

the plugin works in one project but not in another anymore. Both projects use UE 4.14 and I’m using the source file version of the plugin. I copied the exact same plugin files over to make sure I have the right version and all. I can activate the plugin and it runs. When I restart the project in the editor with the plugin already activated and the window open and one bookmark it crashes.
Here is the crash stack:

Access violation - code c0000005 (first/second chance not available)

UE4Editor_CamBookmarkUEr!SCamUErWidget::Construct() [c:\data\mikaboshi2\unrealprojects\client\plugins\cambookmarkuer\source\cambookmarkuer\private\scamuerwidget.cpp:80]
UE4Editor_CamBookmarkUEr!TDecl<SCamUErWidget,RequiredArgs::T0RequiredArgs>::operator<<=() [c:\program files (x86)\epic games\4.14\engine\source\runtime\slatecore\public\widgets\declarativesyntaxsupport.h:1079]
UE4Editor_CamBookmarkUEr!FCamBookmarkUErModule::OnSpawnPluginTab() [c:\data\mikaboshi2\unrealprojects\client\plugins\cambookmarkuer\source\cambookmarkuer\private\cambookmarkuer.cpp:67]
UE4Editor_CamBookmarkUEr!TMemberFunctionCaller<FCamBookmarkUErModule,TSharedRef<SDockTab,0> (__cdecl FCamBookmarkUErModule::)(FSpawnTabArgs const & __ptr64) __ptr64>::operator()<FSpawnTabArgs const & __ptr64>() [c:\program files (x86)\epic games\4.14\engine\source\runtime\core\public\delegates\delegateinstanceinterface.h:161]
UE4Editor_CamBookmarkUEr!TTupleImpl<TIntegerSequence<unsigned int> >::ApplyAfter<TMemberFunctionCaller<FCamBookmarkUErModule,TSharedRef<SDockTab,0> (__cdecl FCamBookmarkUErModule::
)(FSpawnTabArgs const & __ptr64) __ptr64>,FSpawnTabArgs const & __ptr64>() [c:\program files (x86)\epic games\4.14\engine\source\runtime\core\public\delegates uple.h:116]
UE4Editor_CamBookmarkUEr!TBaseRawMethodDelegateInstance<0,FCamBookmarkUErModule,TSharedRef<SDockTab,0> __cdecl(FSpawnTabArgs const & __ptr64)>::Execute() [c:\program files (x86)\epic games\4.14\engine\source\runtime\core\public\delegates\delegateinstancesimpl.h:547]
UE4Editor_Slate!TBaseDelegate<TSharedRef<SDockTab,0>,FSpawnTabArgs const & __ptr64>::Execute() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\core\public\delegates\delegatesignatureimpl.inl:522]
UE4Editor_Slate!FTabManager::SpawnTab() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1301]
UE4Editor_Slate!FTabManager::RestoreArea_Helper() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1160]
UE4Editor_Slate!FTabManager::RestoreSplitterContent() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1275]
UE4Editor_Slate!FTabManager::RestoreArea_Helper() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1253]
UE4Editor_Slate!FTabManager::RestoreSplitterContent() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1275]
UE4Editor_Slate!FTabManager::RestoreArea_Helper() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1253]
UE4Editor_Slate!FTabManager::RestoreSplitterContent() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1275]
UE4Editor_Slate!FTabManager::RestoreArea_Helper() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1253]
UE4Editor_Slate!FTabManager::RestoreSplitterContent() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1275]
UE4Editor_Slate!FTabManager::RestoreArea_Helper() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1244]
UE4Editor_Slate!FTabManager::RestoreArea() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1136]
UE4Editor_Slate!FTabManager::RestoreFrom() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:700]
UE4Editor_LevelEditor!SLevelEditor::RestoreContentArea() [d:\build++ue4+release-4.14+compile\sync\engine\source\editor\leveleditor\private\sleveleditor.cpp:1183]
UE4Editor_LevelEditor!SLevelEditor::Initialize() [d:\build++ue4+release-4.14+compile\sync\engine\source\editor\leveleditor\private\sleveleditor.cpp:166]
UE4Editor_LevelEditor!FLevelEditorModule::SpawnLevelEditor() [d:\build++ue4+release-4.14+compile\sync\engine\source\editor\leveleditor\private\leveleditor.cpp:160]
UE4Editor_LevelEditor!TMemberFunctionCaller<FLevelEditorModule,TSharedRef<SDockTab,0> (__cdecl FLevelEditorModule::)(FSpawnTabArgs const & __ptr64) __ptr64>::operator()<FSpawnTabArgs const & __ptr64>() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\core\public\delegates\delegateinstanceinterface.h:161]
UE4Editor_LevelEditor!TTupleImpl<TIntegerSequence<unsigned int> >::ApplyAfter<TMemberFunctionCaller<FLevelEditorModule,TSharedRef<SDockTab,0> (__cdecl FLevelEditorModule::
)(FSpawnTabArgs const & __ptr64) __ptr64>,FSpawnTabArgs const & __ptr64>() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\core\public\delegates uple.h:116]
UE4Editor_LevelEditor!TBaseRawMethodDelegateInstance<0,FLevelEditorModule,TSharedRef<SDockTab,0> __cdecl(FSpawnTabArgs const & __ptr64)>::Execute() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\core\public\delegates\delegateinstancesimpl.h:547]
UE4Editor_Slate!TBaseDelegate<TSharedRef<SDockTab,0>,FSpawnTabArgs const & __ptr64>::Execute() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\core\public\delegates\delegatesignatureimpl.inl:522]
UE4Editor_Slate!FTabManager::SpawnTab() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1301]
UE4Editor_Slate!FTabManager::RestoreArea_Helper() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1160]
UE4Editor_Slate!FTabManager::RestoreSplitterContent() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1275]
UE4Editor_Slate!FTabManager::RestoreArea_Helper() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1244]
UE4Editor_Slate!FTabManager::RestoreArea() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:1136]
UE4Editor_Slate!FTabManager::RestoreFrom() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\slate\private\framework\docking abmanager.cpp:700]
UE4Editor_MainFrame!FMainFrameModule::CreateDefaultMainFrame() [d:\build++ue4+release-4.14+compile\sync\engine\source\editor\mainframe\private\mainframemodule.cpp:189]
UE4Editor_UnrealEd!EditorInit() [d:\build++ue4+release-4.14+compile\sync\engine\source\editor\unrealed\private\unrealed.cpp:116]
UE4Editor!GuardedMain() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\launch\private\launch.cpp:136]
UE4Editor!GuardedMainWrapper() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:126]
UE4Editor!WinMain() [d:\build++ue4+release-4.14+compile\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:202]
UE4Editor!__scrt_common_main_seh() [f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:264]

ntdll

… huh.
Try removing line 80 in SCamUErWidget.cpp: client = (FEditorViewportClient*)(GEditor->GetActiveViewport()->GetClient());
(which should be superfluous at this point anyway. Maybe it’s trying to create the plugin before the rest of the editor because it was open the last time, and there’s no active viewports yet?) and recompiling it?

Yes this seems to fix it. The error only occurred when you have the CamUR window open but the tab attached to a UE subwindow, like next to your content browser tab. It didn’t occur when the CamUR window was a separate floating window

Yeah, attaching it to the main interface probably makes it get constructed alongside/before the viewports are fully initialized or something to that effect.