UnrealImageCapture icon indicating copy to clipboard operation
UnrealImageCapture copied to clipboard

Sample Project and plugins seems to crash when attempting render in UE 5.0.3 and 5.1.0

Open voxlz opened this issue 2 years ago • 8 comments
trafficstars

As the title claims, I cannot get a image capture to compleate without crashing unreal. I've tried compilin the sample project in both UE 5.0.3 and 5.1.0, and also tried installing it as a plugin in a fresh project. Same result.

I'm triggering the capture in a utility widget like so. image

Error message always throws at line 185 in "C:\Users\*****\Documents\Unreal Projects\ImageCapture\Plugins\CameraCaptureToDisk\Source\CameraCaptureToDisk\Private\CameraCaptureManager.cpp". Attempting to run a float-non-blocking results in similar crash at line 250.

Error:

LoginId:9b7e3dc9443559f5ff884dad673f1823
EpicAccountId:1ea2120a2eaa42989234477b1afde595

Unhandled Exception: EXCEPTION_ACCESS_VIOLATION writing address 0x00000000000004b0

UnrealEditor_CameraCaptureToDisk!ACameraCaptureManager::CaptureNonBlocking() [C:\Users\******\Desktop\CaptureToDisk\Plugins\CameraCaptureToDisk\Source\CameraCaptureToDisk\Private\CameraCaptureManager.cpp:185]
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_CoreUObject
UnrealEditor_UMG
UnrealEditor_UMG
UnrealEditor_UMG
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_Slate
UnrealEditor_ApplicationCore
UnrealEditor_ApplicationCore
UnrealEditor_ApplicationCore
UnrealEditor_ApplicationCore
user32
user32
UnrealEditor_ApplicationCore
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
UnrealEditor
kernel32
ntdll

voxlz avatar Dec 20 '22 14:12 voxlz

+1 Same here. It compiles nicely but trying to place a CaptureManager or inherit from it crashes my editor.

Here's a proper stacktrace with debug symbols enabled:

Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x00007ffa2e8f9000

VCRUNTIME140
UnrealEditor_Engine!UE::Transaction::Internal::FSerializedObjectDataWriterCommon::Serialize() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TransactionCommon.cpp:254]
UnrealEditor_Core!FStructuredArchiveSlot::operator<<() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Serialization\StructuredArchiveSlots.cpp:150]
UnrealEditor_CoreUObject!FByteProperty::SerializeItem() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\PropertyByte.cpp:59]
UnrealEditor_CoreUObject!FArrayProperty::SerializeItem() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\PropertyArray.cpp:367]
UnrealEditor_CoreUObject!FPropertyTag::SerializeTaggedProperty() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\PropertyTag.cpp:253]
UnrealEditor_CoreUObject!UStruct::SerializeVersionedTaggedProperties() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:1590]
UnrealEditor_CoreUObject!UStruct::SerializeTaggedProperties() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:1279]
UnrealEditor_CoreUObject!UObject::SerializeScriptProperties() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Obj.cpp:1633]
UnrealEditor_CoreUObject!UObject::Serialize() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Obj.cpp:1454]
UnrealEditor_CoreUObject!UObject::Serialize() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Obj.cpp:1338]
UnrealEditor_Engine!AActor::Serialize() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:837]
UnrealEditor_UnrealEd!FTransaction::FObjectRecord::SerializeObject() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorTransaction.cpp:183]
UnrealEditor_UnrealEd!FTransaction::FObjectRecord::FObjectRecord() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorTransaction.cpp:73]
UnrealEditor_UnrealEd!FTransaction::SaveObject() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorTransaction.cpp:627]
UnrealEditor_CoreUObject!SaveToTransactionBuffer() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\UObjectGlobals.cpp:2977]
UnrealEditor_CoreUObject!StaticConstructObject_Internal() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\UObjectGlobals.cpp:4216]
UnrealEditor_Engine!UWorld::SpawnActor() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelActor.cpp:660]
UnrealEditor_Engine!UWorld::SpawnActor() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelActor.cpp:440]
UnrealEditor_UnrealEd!UEditorEngine::AddActor() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorEngine.cpp:6525]
UnrealEditor_UnrealEd!FLevelEditorViewportClient::TryPlacingActorFromObject() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\LevelEditorViewport.cpp:242]
UnrealEditor_UnrealEd!FLevelEditorViewportClient::DropObjectsOnActor() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\LevelEditorViewport.cpp:1123]
UnrealEditor_UnrealEd!FLevelEditorViewportClient::DropObjectsAtCoordinates() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\LevelEditorViewport.cpp:1566]
UnrealEditor_LevelEditor!SLevelViewport::HandlePlaceDraggedObjects() [D:\build\++UE5\Sync\Engine\Source\Editor\LevelEditor\Private\SLevelViewport.cpp:971]
UnrealEditor_LevelEditor!SLevelViewport::OnDrop() [D:\build\++UE5\Sync\Engine\Source\Editor\LevelEditor\Private\SLevelViewport.cpp:1049]
UnrealEditor_Slate!<lambda_471858b7e70a8b68bd65bc435c2a047c>::operator()() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5088]
UnrealEditor_Slate!FEventRouter::Route<FReply,FEventRouter::FBubblePolicy,FPointerEvent,<lambda_471858b7e70a8b68bd65bc435c2a047c> >() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:412]
UnrealEditor_Slate!FSlateApplication::RoutePointerUpEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5083]
UnrealEditor_Slate!FSlateApplication::ProcessMouseButtonUpEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5601]
UnrealEditor_Slate!FSlateApplication::OnMouseUp() [D:\build\++UE5\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5566]
UnrealEditor_ApplicationCore!FWindowsApplication::ProcessDeferredMessage() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:2219]
UnrealEditor_ApplicationCore!FWindowsApplication::DeferMessage() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:2726]
UnrealEditor_ApplicationCore!FWindowsApplication::ProcessMessage() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:1895]
UnrealEditor_ApplicationCore!FWindowsApplication::AppWndProc() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:925]
user32
user32
InkObj
atlthunk
user32
user32
UnrealEditor_ApplicationCore!FWindowsPlatformApplicationMisc::PumpMessages() [D:\build\++UE5\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsPlatformApplicationMisc.cpp:142]
UnrealEditor!FEngineLoop::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:5291]
UnrealEditor!GuardedMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:202]
UnrealEditor!GuardedMainWrapper() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:107]
UnrealEditor!LaunchWindowsStartup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:244]
UnrealEditor!WinMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:282]
UnrealEditor!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
kernel32
ntdll

EDIT: Getting this error during runtime now when trying to call CaptureNonBlocking

agaertner avatar Jan 10 '23 13:01 agaertner

Hey, thanks for the bump and sorry for not getting back to you earlier - you got lost in the Christmas holiday 🙈

I just clone the repo as is and updated my engine to UE 5.1.0. However, I cannot reproduce your crashes... I was able to get grab images in all data-types.

@agaertner Do you happen to make the call automatically, immediately in the very first tick of your game? Because I see the Tick() call in the trace... I once had that issue - for some reason you need to wait for some frames before the components are all ready.

@voxlz Can you check line 185 (where the color capture crashes) for me? Because strangely that is where Gamma is set and not an image grabbing section- maybe the SceneCapture is not connected correctly? :/

TimmHess avatar Jan 10 '23 16:01 TimmHess

UnrealEditor_unreal_minirov_patch_0!ACaptureManager::CaptureNonBlocking() [I:\Repositories\MARUM\unreal-minirov\Source\unreal_minirov\Private\CaptureManager.cpp:61]
UnrealEditor_CoreUObject!UFunction::Invoke() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:6455]
UnrealEditor_CoreUObject!UObject::CallFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1118]
UnrealEditor_CoreUObject!UObject::ProcessContextOpcode() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:3084]
UnrealEditor_CoreUObject!ProcessLocalScriptFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1188]
UnrealEditor_CoreUObject!ProcessScriptFunction<void (__cdecl*)(UObject *,FFrame &,void *)>() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1018]
UnrealEditor_CoreUObject!ProcessLocalFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1258]
UnrealEditor_CoreUObject!ProcessLocalScriptFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1188]
UnrealEditor_CoreUObject!UObject::ProcessInternal() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1285]
UnrealEditor_CoreUObject!UFunction::Invoke() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:6455]
UnrealEditor_CoreUObject!UObject::ProcessEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:2116]
UnrealEditor_Engine!AActor::ProcessEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:1055]
UnrealEditor_Engine!AActor::ReceiveTick() [D:\build\++UE5\Sync\Engine\Intermediate\Build\Win64\UnrealEditor\Inc\Engine\UHT\Actor.gen.cpp:2161]
UnrealEditor_Engine!AActor::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:1430]
UnrealEditor_Engine!AActor::TickActor() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:1410]
UnrealEditor_Engine!FActorTickFunction::ExecuteTick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Actor.cpp:222]
UnrealEditor_Engine!FTickFunctionTask::DoTask() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TickTaskManager.cpp:284]
UnrealEditor_Engine!TGraphTask<FTickFunctionTask>::ExecuteTask() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\TaskGraphInterfaces.h:1348]
UnrealEditor_Core!FNamedTaskThread::ProcessTasksNamedThread() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:760]
UnrealEditor_Core!FNamedTaskThread::ProcessTasksUntilQuit() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:649]
UnrealEditor_Core!FTaskGraphCompatibilityImplementation::WaitUntilTasksComplete() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:2203]
UnrealEditor_Engine!FTickTaskSequencer::ReleaseTickGroup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TickTaskManager.cpp:565]
UnrealEditor_Engine!FTickTaskManager::RunTickGroup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TickTaskManager.cpp:1592]
UnrealEditor_Engine!UWorld::RunTickGroup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelTick.cpp:794]
UnrealEditor_Engine!UWorld::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelTick.cpp:1537]
UnrealEditor_UnrealEd!UEditorEngine::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorEngine.cpp:1890]
UnrealEditor_UnrealEd!UUnrealEdEngine::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\UnrealEdEngine.cpp:517]
UnrealEditor!FEngineLoop::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:5367]
UnrealEditor!GuardedMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:202]
UnrealEditor!GuardedMainWrapper() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:107]
UnrealEditor!LaunchWindowsStartup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:244]
UnrealEditor!WinMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:282]
UnrealEditor!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
kernel32
ntdll

This is the line its referencing at the top:

void ACaptureManager::CaptureNonBlocking() {
    if (!IsValid(CaptureComponent)) {
        UE_LOG(LogTemp, Error, TEXT("CaptureColorNonBlocking: CaptureComponent was not valid!"));
        return;
    }

    // reference in stacktrace
    CaptureComponent->GetCaptureComponent2D()->TextureTarget->TargetGamma = GEngine->GetDisplayGamma();
    
    [...]

My BP setup: image

ObserverEnabled is set to true after SceneCapture2D has been created and assigned to the CaptureManager.

agaertner avatar Jan 10 '23 17:01 agaertner

Okay, I can think of two things of the top of my head:

  1. as mentioned above - if this is executed very early in the game/simulation - you can try to either delay it or for testing's sake add a button event to trigger the capture manually from the keyboard. This is just to make sure it's not because of some random hiccups in the engine setting up components in the world.
  2. Do try a nullptr / Valid check on every part of the component chain here: CamptureComponent2D* TextureTarget*. If the code crashes here it really looks like a nullptr or otherwise invalid component sneaked into the setup..

I hope this does something for you :+1:

TimmHess avatar Jan 11 '23 08:01 TimmHess

Okay, I can think of two things of the top of my head:

  1. as mentioned above - if this is executed very early in the game/simulation - you can try to either delay it or for testing's sake add a button event to trigger the capture manually from the keyboard. This is just to make sure it's not because of some random hiccups in the engine setting up components in the world.
  2. Do try a nullptr / Valid check on every part of the component chain here: CamptureComponent2D* TextureTarget*. If the code crashes here it really looks like a nullptr or otherwise invalid component sneaked into the setup..

I hope this does something for you 👍

It actually spawns the manager on startup and spawns the scenecapture on keyboard press.

I will try adding other checks then.

agaertner avatar Jan 11 '23 13:01 agaertner

The issue was that the SceneCapture2D had no TextureTarget by default. I fixed that ~~by creating a child BP with a default render target.~~ (Edit: Scratched. I forgot about SetupCaptureComponent which creates a target texture on runtime.)

Now I have another crash further down with the following stacktrace (fixed, see below):

Assertion failed: RawSize < Height* InBytesPerRow [File:./Runtime/ImageWrapper/Private/ImageWrapperBase.cpp] [Line: 139]

libUnrealEditor-ImageWrapper.so!FImageWrapperBase::SetRaw(void const*, long long, int, int, ERGBFormat, int, int) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/ImageWrapper/Private/ImageWrapperBase.cpp:139]
libUnrealEditor-unreal_minirov.so!ACaptureManager::Tick(float) [/home/agaertner/repos/unreal-minirov/Source/unreal_minirov/Private/CaptureManager.cpp:246]
libUnrealEditor-Engine.so!FActorTickFunction::ExecuteTick(float, ELevelTick, ENamedThreads::Type, TRefCountPtr<FGraphEvent> const&) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/Actor.cpp:222]
libUnrealEditor-Engine.so!FTickFunctionTask::DoTask(ENamedThreads::Type, TRefCountPtr<FGraphEvent> const&) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/TickTaskManager.cpp:284]
libUnrealEditor-Engine.so!TGraphTask<FTickFunctionTask>::ExecuteTask(TArray<FBaseGraphTask*, TSizedDefaultAllocator<32> >&, ENamedThreads::Type, bool) [/mnt/horde/++UE5/Sync/Engine/Source/Runtime/Core/Public/Async/TaskGraphInterfaces.h:1348]
libUnrealEditor-Core.so!FNamedTaskThread::ProcessTasksNamedThread(int, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:760]
libUnrealEditor-Core.so!FNamedTaskThread::ProcessTasksUntilQuit(int) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:648]
libUnrealEditor-Core.so!FTaskGraphCompatibilityImplementation::ProcessThreadUntilRequestReturn(ENamedThreads::Type) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:2149]
libUnrealEditor-Core.so!FTaskGraphCompatibilityImplementation::WaitUntilTasksComplete(TArray<TRefCountPtr<FGraphEvent>, TSizedInlineAllocator<4u, 32, TSizedDefaultAllocator<32> > > const&, ENamedThreads::Type) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:2203]
libUnrealEditor-Engine.so!FTickTaskSequencer::ReleaseTickGroup(ETickingGroup, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/TickTaskManager.cpp:564]
libUnrealEditor-Engine.so!FTickTaskManager::RunTickGroup(ETickingGroup, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/TickTaskManager.cpp:1591]
libUnrealEditor-Engine.so!UWorld::Tick(ELevelTick, float) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Engine/Private/LevelTick.cpp:1537]
libUnrealEditor-UnrealEd.so!UEditorEngine::Tick(float, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Editor/UnrealEd/Private/EditorEngine.cpp:1888]
libUnrealEditor-UnrealEd.so!UUnrealEdEngine::Tick(float, bool) [/mnt/horde/++UE5/Sync/Engine/Source/./Editor/UnrealEd/Private/UnrealEdEngine.cpp:514]
UnrealEditor!FEngineLoop::Tick() [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Launch/Private/LaunchEngineLoop.cpp:5361]
UnrealEditor!GuardedMain(char16_t const*) [/mnt/horde/++UE5/Sync/Engine/Source/./Runtime/Launch/Private/Launch.cpp:204]
libUnrealEditor-UnixCommonStartup.so!CommonUnixMain(int, char**, int (*)(char16_t const*), void (*)()) [/mnt/horde/++UE5/Sync/Engine/Source/Runtime/Unix/UnixCommonStartup/Private/UnixCommonStartup.cpp:269]
libc.so.6!UnknownFunction(0x29d8f)
libc.so.6!__libc_start_main(+0x7f)
UnrealEditor!_start()

FIXED My setup is that I create a CaptureManager before I have a SceneCapture2D but SetupCaptureComponent is only called once after creation during BeginPlay. My SceneCapture2D can be created on runtime (after an arbitrary amount of time passed with the press of a key). So what I had to do is make the scope of theSetupCaptureComponent method public and annotate it as BlueprintCallable so I can use it whenever I assign a new SceneCapture2D from within my BP. This gives the CaptureManager more flexibility anyway and I don't have to recreate it for the SetupCaptureComponent to be called.

Now it works perfectly. I will have to change the save directory to point to some other partition because FPaths::ProjectSavedDir()points to the home/ saved dir of UnrealEngine on my linux machine (ie. /home/user/.config/Epic/UnrealEngine/5.1/Saved/observer/)

Hopefully this little documentation will help some people with above problem.

agaertner avatar Jan 11 '23 15:01 agaertner

Ah, nice! Indeed, there are still many quirks that I am unaware of - thanks for sharing!

TimmHess avatar Jan 11 '23 17:01 TimmHess

I might create a fork someday and do some PRs if I can get to it (pretty busy right now). Though, what I can say is a feature that I needed was access to the TArray from within a BP (ie. access to the current frame) to use it with another plugin of mine that takes that byte array as param. I did that by simply creating a TArray<uint8> CurrentFrame field and assigning it with the raw data before the Saving To Disk part. I also added a boolean SaveToDisk because the saving to disk is more like a debug helper for me.

agaertner avatar Jan 12 '23 09:01 agaertner