void UGTCaptureComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) // void UGTCaptureComponent::Tick(float DeltaTime) // This tick function should be called by the scene instead of been { // Render pixels out in the next tick. To allow time to render images out. // Update rotation of each frame // from ab237f46dc0eee40263acbacbe938312eb0dffbb:CameraComponent.cpp:232 check(this->Pawn); // this GTCapturer should be released, if the Pawn is deleted. const APawn* OwningPawn = this->Pawn; const AController* OwningController = OwningPawn ? OwningPawn->GetController() : nullptr; if (OwningController && OwningController->IsLocalPlayerController()) { const FRotator PawnViewRotation = OwningPawn->GetViewRotation(); for (auto Elem : CaptureComponents) { USceneCaptureComponent2D* CaptureComponent = Elem.Value; if (!PawnViewRotation.Equals(CaptureComponent->GetComponentRotation())) { CaptureComponent->SetWorldRotation(PawnViewRotation); } } } while (!PendingTasks.IsEmpty()) { FGTCaptureTask Task; PendingTasks.Peek(Task); uint64 CurrentFrame = GFrameCounter; int32 SkipFrame = 1; if (!(CurrentFrame > Task.CurrentFrame + SkipFrame)) // TODO: This is not an elegant solution, fix it later. { // Wait for the rendering thread to catch up game thread. break; } PendingTasks.Dequeue(Task); USceneCaptureComponent2D* CaptureComponent = this->CaptureComponents.FindRef(Task.Mode); if (CaptureComponent == nullptr) { UE_LOG(LogUnrealCV, Warning, TEXT("Unrecognized capture mode %s"), *Task.Mode); } else { FString LowerCaseFilename = Task.Filename.ToLower(); if (LowerCaseFilename.EndsWith("png")) { SavePng(CaptureComponent->TextureTarget, Task.Filename); } else if (LowerCaseFilename.EndsWith("exr")) { SaveExr(CaptureComponent->TextureTarget, Task.Filename); } else { UE_LOG(LogUnrealCV, Warning, TEXT("Unrecognized image file extension %s"), *LowerCaseFilename); } } Task.AsyncRecord->bIsCompleted = true; } }
void SaveImage(const Image<unsigned char>& image, const pangolin::VideoPixelFormat& fmt, const std::string& filename, ImageFileType file_type, bool top_line_first) { switch (file_type) { case ImageFileTypePng: return SavePng(image, fmt, filename, top_line_first); case ImageFileTypeExr: return SaveExr(image, fmt, filename, top_line_first); default: throw std::runtime_error("Unsupported image file type, '" + filename + "'"); } }