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 UCameraComponent::GetCameraView(float DeltaTime, FMinimalViewInfo& DesiredView) { if (bUsePawnControlRotation) { if (APawn* OwningPawn = Cast<APawn>(GetOwner())) { const FRotator PawnViewRotation = OwningPawn->GetViewRotation(); if (!PawnViewRotation.Equals(GetComponentRotation())) { SetWorldRotation(PawnViewRotation); } } } DesiredView.Location = GetComponentLocation(); DesiredView.Rotation = GetComponentRotation(); DesiredView.FOV = FieldOfView; DesiredView.AspectRatio = AspectRatio; DesiredView.bConstrainAspectRatio = bConstrainAspectRatio; DesiredView.ProjectionMode = ProjectionMode; DesiredView.OrthoWidth = OrthoWidth; // See if the CameraActor wants to override the PostProcess settings used. DesiredView.PostProcessBlendWeight = PostProcessBlendWeight; if (PostProcessBlendWeight > 0.0f) { DesiredView.PostProcessSettings = PostProcessSettings; } }
TArray<uint8> UGTCaptureComponent::CaptureNpyFloat16(FString Mode, int32 Channels) { // Flush location and rotation check(CaptureComponents.Num() != 0); USceneCaptureComponent2D* CaptureComponent = CaptureComponents.FindRef(Mode); TArray<uint8> NpyData; if (CaptureComponent == nullptr) { UE_LOG(LogUnrealCV, Error, TEXT("Component for mode %s not found. Returning empty array."), *Mode); return NpyData; } // Attach this to something, for example, a real camera const FRotator PawnViewRotation = Pawn->GetViewRotation(); if (!PawnViewRotation.Equals(CaptureComponent->GetComponentRotation())) { CaptureComponent->SetWorldRotation(PawnViewRotation); } UTextureRenderTarget2D* RenderTarget = CaptureComponent->TextureTarget; int32 Width = RenderTarget->SizeX, Height = RenderTarget->SizeY; TArray<FFloat16Color> ImageData; FTextureRenderTargetResource* RenderTargetResource; ImageData.AddUninitialized(Width * Height); RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource(); RenderTargetResource->ReadFloat16Pixels(ImageData); // Check the byte order of data // Compress image data to npy array // Generate a header for the numpy array NpyData = NpySerialization(ImageData, Width, Height, Channels); return NpyData; }
TArray<uint8> UGTCaptureComponent::CapturePng(FString Mode) { // Flush location and rotation check(CaptureComponents.Num() != 0); USceneCaptureComponent2D* CaptureComponent = CaptureComponents.FindRef(Mode); TArray<uint8> ImgData; if (CaptureComponent == nullptr) return ImgData; // Attach this to something, for example, a real camera const FRotator PawnViewRotation = Pawn->GetViewRotation(); if (!PawnViewRotation.Equals(CaptureComponent->GetComponentRotation())) { CaptureComponent->SetWorldRotation(PawnViewRotation); } UTextureRenderTarget2D* RenderTarget = CaptureComponent->TextureTarget; static IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper")); static TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG); int32 Width = RenderTarget->SizeX, Height = RenderTarget->SizeY; TArray<FColor> Image; FTextureRenderTargetResource* RenderTargetResource; Image.AddZeroed(Width * Height); RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource(); FReadSurfaceDataFlags ReadSurfaceDataFlags; ReadSurfaceDataFlags.SetLinearToGamma(false); // This is super important to disable this! // Instead of using this flag, we will set the gamma to the correct value directly RenderTargetResource->ReadPixels(Image, ReadSurfaceDataFlags); ImageWrapper->SetRaw(Image.GetData(), Image.GetAllocatedSize(), Width, Height, ERGBFormat::BGRA, 8); ImgData = ImageWrapper->GetCompressed(); return ImgData; }
FAsyncRecord* UGTCaptureComponent::Capture(FString Mode, FString InFilename) { // Flush location and rotation check(CaptureComponents.Num() != 0); USceneCaptureComponent2D* CaptureComponent = CaptureComponents.FindRef(Mode); if (CaptureComponent == nullptr) return nullptr; const FRotator PawnViewRotation = Pawn->GetViewRotation(); if (!PawnViewRotation.Equals(CaptureComponent->GetComponentRotation())) { CaptureComponent->SetWorldRotation(PawnViewRotation); } FAsyncRecord* AsyncRecord = FAsyncRecord::Create(); FGTCaptureTask GTCaptureTask = FGTCaptureTask(Mode, InFilename, GFrameCounter, AsyncRecord); this->PendingTasks.Enqueue(GTCaptureTask); return AsyncRecord; }
bool FLightingPromotionPointLightPlaceRotScaleTest::RunTest(const FString& Parameters) { //** SETUP **// // Create the world. UWorld* World = AutomationEditorCommonUtils::CreateNewMap(); ULevel* CurrentLevel = World->GetCurrentLevel(); // Test Summary AddLogItem(TEXT("Place, Scale, and Rotate.\n- A Point light is placed into the world.\n- The light is moved.\n- The light is rotated.\n- The light is scaled up.")); if (!LightingTestHelpers::DoesActorExistInTheLevel(CurrentLevel, TEXT("PointLight"), APointLight::StaticClass())) { //** TEST **// // Add a point light to the level. APointLight* PointLight = Cast<APointLight>(GEditor->AddActor(World->GetCurrentLevel(), APointLight::StaticClass(), FTransform())); // Set the actors location, rotation, and scale3D. PointLight->SetActorLocation(POINT_LIGHT_UPDATED_LOCATION); PointLight->SetActorRotation(POINT_LIGHT_UPDATED_ROTATION); PointLight->SetActorScale3D(POINT_LIGHT_UPDATED_SCALE3D); //** VERIFY **// FVector CurrentLocation; LightingTestHelpers::GetActorCurrentLocation(CurrentLevel, PointLight->GetName(), CurrentLocation); FRotator CurrentRotation; LightingTestHelpers::GetActorCurrentRotation(CurrentLevel, PointLight->GetName(), CurrentRotation); FVector CurrentScale3D; LightingTestHelpers::GetActorCurrentScale3D(CurrentLevel, PointLight->GetName(), CurrentScale3D); bool RotationsAreEqual = CurrentRotation.Equals(POINT_LIGHT_UPDATED_ROTATION, 1); TestTrue(TEXT("The placed point light was not found."), LightingTestHelpers::DoesActorExistInTheLevel(CurrentLevel, PointLight->GetName(), PointLight->GetClass())); TestEqual<FVector>(TEXT("The point light is not in correct location"), POINT_LIGHT_UPDATED_LOCATION, CurrentLocation); TestTrue(TEXT("The point light is not rotated correctly."), RotationsAreEqual); TestEqual<FVector>(TEXT("The point light is not scaled correctly."), POINT_LIGHT_UPDATED_SCALE3D, CurrentScale3D); return true; } AddError(TEXT("A point light already exists in this level which will block the verification of a new point light.")); return false; }
void AAIController::UpdateControlRotation(float DeltaTime, bool bUpdatePawn) { APawn* const MyPawn = GetPawn(); if (MyPawn) { FRotator NewControlRotation = GetControlRotation(); // Look toward focus const FVector FocalPoint = GetFocalPoint(); if (FAISystem::IsValidLocation(FocalPoint)) { NewControlRotation = (FocalPoint - MyPawn->GetPawnViewLocation()).Rotation(); } else if (bSetControlRotationFromPawnOrientation) { NewControlRotation = MyPawn->GetActorRotation(); } // Don't pitch view unless looking at another pawn if (NewControlRotation.Pitch != 0 && Cast<APawn>(GetFocusActor()) == nullptr) { NewControlRotation.Pitch = 0.f; } SetControlRotation(NewControlRotation); if (bUpdatePawn) { const FRotator CurrentPawnRotation = MyPawn->GetActorRotation(); if (CurrentPawnRotation.Equals(NewControlRotation, 1e-3f) == false) { MyPawn->FaceRotation(NewControlRotation, DeltaTime); } } } }
TArray<uint8> UGTCaptureComponent::CaptureNpyUint8(FString Mode, int32 Channels) { // Flush location and rotation check(CaptureComponents.Num() != 0); USceneCaptureComponent2D* CaptureComponent = CaptureComponents.FindRef(Mode); TArray<uint8> NpyData; if (CaptureComponent == nullptr) { UE_LOG(LogUnrealCV, Error, TEXT("Component for mode %s not found. Returning empty array."), *Mode); return NpyData; } // Attach this to something, for example, a real camera const FRotator PawnViewRotation = Pawn->GetViewRotation(); if (!PawnViewRotation.Equals(CaptureComponent->GetComponentRotation())) { CaptureComponent->SetWorldRotation(PawnViewRotation); } UTextureRenderTarget2D* RenderTarget = CaptureComponent->TextureTarget; int32 Width = RenderTarget->SizeX, Height = RenderTarget->SizeY; TArray<FColor> ImageData; FTextureRenderTargetResource* RenderTargetResource; ImageData.AddUninitialized(Width * Height); RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource(); FReadSurfaceDataFlags ReadSurfaceDataFlags; ReadSurfaceDataFlags.SetLinearToGamma(false); // This is super important to disable this! // Instead of using this flag, we will set the gamma to the correct value directly RenderTargetResource->ReadPixels(ImageData, ReadSurfaceDataFlags); // Check the byte order of data // Compress image data to npy array // Generate a header for the numpy array NpyData = NpySerialization(ImageData, Width, Height, Channels); return NpyData; }
bool UKismetMathLibrary::NotEqual_RotatorRotator(FRotator A, FRotator B, float ErrorTolerance) { return !A.Equals(B, ErrorTolerance); }