Skip to content
Snippets Groups Projects
Select Git revision
  • ce80f49b1be70e6afa8ed801fa12d54206aee9f6
  • master default protected
  • develop
  • semantic
  • auto-inflate
  • feature/aps
  • legacy protected
  • 10.0.0
  • 9.3.8
  • 9.3.7
  • 9.3.6
  • 9.3.5
  • 9.3.4
  • 9.3.3
  • 9.3.2
  • 9.3.1
  • 9.3.0
  • 9.2.0
  • 9.1.2
  • 9.1.1
  • 9.1.0
  • 9.0.1
  • 9.0.0
  • 8.2.5
  • 8.2.4
  • 8.2.3
  • 8.2.2
27 results

scheduler.py

Blame
  • OptiXCameraActor.cpp 6.76 KiB
    #undef UpdateResource
    
    #include "OptiXCameraActor.h"
    
    #include "OptiXModule.h"
    #include "OptiXTextureSampler.h"
    #include "OptiXLaserActor.h"
    
    #include "Engine/EngineTypes.h"
    #include <EngineGlobals.h>
    #include "Runtime/Engine/Classes/Camera/PlayerCameraManager.h"
    #include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"
    #include "Runtime/Engine/Classes/Engine/LocalPlayer.h"
    #include "Runtime/Engine/Public/SceneView.h"
    #include <Runtime/Engine/Classes/Engine/Engine.h>
    #include "Runtime/Engine/Public/HighResScreenshot.h"
    #include "Runtime/Engine/Classes/Engine/TextureRenderTarget2D.h"
    #include "Runtime/Engine/Classes/Engine/TextureRenderTargetCube.h"
    #include "Runtime/Engine/Classes/Materials/MaterialInstanceDynamic.h"
    #include "Runtime/Engine/Classes/Engine/Light.h"
    #include "Runtime/Engine/Classes/GameFramework/GameUserSettings.h"
    #include "Runtime/Engine/Classes/GameFramework/PlayerStart.h"
    
    // VR
    #include "Runtime/HeadMountedDisplay/Public/IHeadMountedDisplay.h"
    #include "Runtime/HeadMountedDisplay/Public/IXRTrackingSystem.h"
    #include "Runtime/HeadMountedDisplay/Public/IXRCamera.h"
    
    #include "Runtime/Engine/Classes/Camera/CameraActor.h"
    
    
    DEFINE_LOG_CATEGORY(OptiXPluginCameraActor);
    
    
    UOptiXBlendable::UOptiXBlendable(const FObjectInitializer& ObjectInitializer)
    	: Super(ObjectInitializer)
    {
    	BlendWeight = 1.0f;
    }
    
    void UOptiXBlendable::OverrideBlendableSettings(FSceneView & View, float InWeight) const
    {
    	float Weight = FMath::Clamp(BlendWeight, 0.0f, 1.0f) * InWeight;
    }
    
    AOptiXPlayerCameraManager::AOptiXPlayerCameraManager(const FObjectInitializer& ObjectInitializer)
    	: Super(ObjectInitializer)
    {
    	UE_LOG(OptiXPluginCameraActor, Display, TEXT("Optix Camera Manager Constructor!"));
    
    	SceneCaptureComponent = ObjectInitializer.CreateDefaultSubobject<USceneCaptureComponent2D>(this, TEXT("SceneCaptureComponent0"));
    	RootComponent = SceneCaptureComponent;
    	SceneCaptureComponent->bCaptureEveryFrame = false;
    	SceneCaptureComponent->bCaptureOnMovement = false;
    	//SceneCaptureComponent->bEnableClipPlane = true; // don't want ourself in the capture
    	SceneCaptureComponent->FOVAngle = 90.0f;
    	SceneCaptureComponent->HideActorComponents(this);
    	//SceneCaptureComponent->CaptureSource = SCS_SceneColorHDR;
    	//SceneCaptureComponent->HideActorComponents(UGameplayStatics::GetPlayerController(GetWorld(), 0));
    	//SceneCaptureComponent->HideActorComponents(UGameplayStatics::GetPlayerPawn(GetWorld(), 0));
    
    	SceneCaptureCubeComponent = ObjectInitializer.CreateDefaultSubobject<USceneCaptureComponentCube>(this, TEXT("SceneCaptureComponentCube0"));
    	SceneCaptureCubeComponent->SetupAttachment(SceneCaptureComponent);
    	SceneCaptureCubeComponent->bCaptureEveryFrame = false;
    	SceneCaptureCubeComponent->bCaptureOnMovement = false;
    	SceneCaptureCubeComponent->HideActorComponents(this);
    
    
    	PostProcessComponent = ObjectInitializer.CreateDefaultSubobject<UPostProcessComponent>(this, TEXT("PostProcessComponent0"));
    	PostProcessComponent->SetupAttachment(SceneCaptureCubeComponent); // Doesn't matter anyway
    	PostProcessComponent->bUnbound = true; // Should be default anyway
    
    	PrimaryActorTick.bCanEverTick = true;
    	//PrimaryActorTick.TickGroup = TG_PostUpdateWork;
    
    
    	// TODO DEBUG CREATE IN C++
    	//static ConstructorHelpers::FObjectFinder<UTextureRenderTargetCube> RT(TEXT("TextureRenderTarget2D'/OptiX/PPMaterials/RTCube.RTCube'"));
    
    	//if (RT.Object != NULL)
    	//{
    	//	CubeRenderTarget = RT.Object;
    	//	SceneCaptureCubeComponent->TextureTarget = CubeRenderTarget;
    
    	//}
    
    
    	CubeRenderTarget = NewObject<UTextureRenderTargetCube>();
    	CubeRenderTarget->Init(1024, PF_B8G8R8A8);
    	CubeRenderTarget->UpdateResource();
    	SceneCaptureCubeComponent->TextureTarget = CubeRenderTarget;
    
    	//FRotator Rotation = FRotationMatrix::MakeFromX(Directions[i]).Rotator();
    	//FQuat Q = FQuat({ 1, 0, 0 });
    	//SceneCaptureComponent->AddWorldRotation();
    
    	for (uint8 i = 0; i < 6; i++)
    	{
    		UTextureRenderTarget2D* RenderTarget = NewObject<UTextureRenderTarget2D>();
    		//RenderTarget->AddToRoot();
    		RenderTarget->InitCustomFormat(CubemapSize, CubemapSize, PF_B8G8R8A8, true);
    		//RenderTarget->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
    		//RenderTarget->SRGB = 0;
    		//RenderTarget->TargetGamma = 2.2;
    		RenderTarget->NeverStream = 1;
    		//RenderTarget->InitAutoFormat(CubemapSize, CubemapSize);
    		RenderTarget->UpdateResourceImmediate(); //???
    		//RenderTarget->AdjustBrightness = 1.0; // ??? TODO
    		CubemapRenderTargets.Add(RenderTarget);
    	}
    
    }
    
    void AOptiXPlayerCameraManager::BeginPlay()
    {
    	
    	//UGameplayStatics::GetPlayerController(GetWorld(), 0)->SetViewTarget(this);
    	UE_LOG(OptiXPluginCameraActor, Display, TEXT("OptiX Camera Manager Begin Play!"));
    	Super::BeginPlay();
    
    	Init();
    }
    
    void AOptiXPlayerCameraManager::EndPlay(const EEndPlayReason::Type EndPlayReason)
    {
    	// Clean up again TODO
    	Super::EndPlay(EndPlayReason);
    }
    
    void AOptiXPlayerCameraManager::Tick(float DeltaSeconds)
    {
    	Super::Tick(DeltaSeconds);
    	if (C == 2)
    	{
    		CaptureCubemap();
    		bCubemapCaptured.AtomicSet(true);
    		//InitCubemap();
    		SetActorTickEnabled(false);
    		return; // no need to increase C further
    	}
    	C++;
    }
    
    
    void AOptiXPlayerCameraManager::Init()
    {
    	PostProcessComponent->AddOrUpdateBlendable(FOptiXModule::Get().GetOptiXContextManager()->GetOptiXMID(), 1.0f);
    	FOptiXModule::Get().GetOptiXContextManager()->SetActiveCameraActor(this);
    }
    
    
    
    void AOptiXPlayerCameraManager::CaptureCubemap()
    {
    
    	// 2D
    	TArray<FVector> Directions =
    	{
    		{1, 0, 0},
    		{-1, 0, 0},
    		{0, 1, 0},
    		{0, -1, 0},
    		{0, 0, -1},
    		{0, 0, 1}
    	};
    
    	SceneCaptureComponent->HideActorComponents(UGameplayStatics::GetPlayerController(GetWorld(), 0));
    	SceneCaptureComponent->HideActorComponents(UGameplayStatics::GetPlayerPawn(GetWorld(), 0));
    	
    	TArray<AActor*> FoundLaserActors;
    	UGameplayStatics::GetAllActorsOfClass(GetWorld(), AOptiXLaserActor::StaticClass(), FoundLaserActors);
    
    	for (AActor* Actor : FoundLaserActors)
    	{
    		SceneCaptureComponent->HideComponent(Cast<AOptiXLaserActor>(Actor)->LineInstancedStaticMeshComponent);
    		SceneCaptureCubeComponent->HideComponent(Cast<AOptiXLaserActor>(Actor)->LineInstancedStaticMeshComponent);
    	}
    
    	// the actual camera position is still 0 here, so the capture would be at the origin and not the actual player start.
    	// Let's move the capture "into" the first lens actor. 
    
    	TArray<AActor*> FoundPlayerStarts;
    	UGameplayStatics::GetAllActorsOfClass(GetWorld(), APlayerStart::StaticClass(), FoundPlayerStarts);
    
    
    	FVector Loc = FoundPlayerStarts[0]->GetActorLocation(); // Just use the first one
    
    	// CUBE
    
    	SceneCaptureCubeComponent->HideActorComponents(UGameplayStatics::GetPlayerController(GetWorld(), 0));
    	SceneCaptureCubeComponent->HideActorComponents(UGameplayStatics::GetPlayerPawn(GetWorld(), 0));
    	//SceneCaptureCubeComponent->SetWorldRotation(FQuat(FVector(0, 1, 0), 180));
    	SceneCaptureCubeComponent->SetWorldLocation(Loc);
    
    	SceneCaptureCubeComponent->CaptureScene();
    	
    
    }