AEmitterCameraLensEffectBase* APlayerCameraManager::FindCameraLensEffect(TSubclassOf<AEmitterCameraLensEffectBase> LensEffectEmitterClass)
{
	for (int32 i = 0; i < CameraLensEffects.Num(); ++i)
	{
		AEmitterCameraLensEffectBase* LensEffect = CameraLensEffects[i];
		if ( !LensEffect->IsPendingKill() &&
			( (LensEffect->GetClass() == LensEffectEmitterClass) ||
			(LensEffect->EmittersToTreatAsSame.Find(LensEffectEmitterClass) != INDEX_NONE) ||
			(GetDefault<AEmitterCameraLensEffectBase>(LensEffectEmitterClass)->EmittersToTreatAsSame.Find(LensEffect->GetClass()) != INDEX_NONE ) ) )
		{
			return LensEffect;
		}
	}

	return NULL;
}
AEmitterCameraLensEffectBase* APlayerCameraManager::AddCameraLensEffect(TSubclassOf<AEmitterCameraLensEffectBase> LensEffectEmitterClass)
{
	if (LensEffectEmitterClass != NULL)
	{
		AEmitterCameraLensEffectBase* LensEffect = NULL;
		if (!GetDefault<AEmitterCameraLensEffectBase>(LensEffectEmitterClass)->bAllowMultipleInstances)
		{
			LensEffect = FindCameraLensEffect(LensEffectEmitterClass);

			if (LensEffect != NULL)
			{
				LensEffect->NotifyRetriggered();
			}
		}

		if (LensEffect == NULL)
		{
			// spawn with viewtarget as the owner so bOnlyOwnerSee works as intended
			FActorSpawnParameters SpawnInfo;
			SpawnInfo.Owner = PCOwner->GetViewTarget();
			SpawnInfo.Instigator = Instigator;
			SpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
			SpawnInfo.ObjectFlags |= RF_Transient;	// We never want to save these into a map
			
			AEmitterCameraLensEffectBase const* const EmitterCDO = LensEffectEmitterClass->GetDefaultObject<AEmitterCameraLensEffectBase>();
			FVector CamLoc;
			FRotator CamRot;
			GetCameraViewPoint(CamLoc, CamRot);
			FTransform SpawnTransform = AEmitterCameraLensEffectBase::GetAttachedEmitterTransform(EmitterCDO, CamLoc, CamRot, GetFOVAngle());
			
			LensEffect = GetWorld()->SpawnActor<AEmitterCameraLensEffectBase>(LensEffectEmitterClass, SpawnTransform, SpawnInfo);
			if (LensEffect != NULL)
			{
				LensEffect->RegisterCamera(this);
				CameraLensEffects.Add(LensEffect);
			}
		}
		
		return LensEffect;
	}

	return NULL;
}
AEmitterCameraLensEffectBase* APlayerCameraManager::AddCameraLensEffect(TSubclassOf<AEmitterCameraLensEffectBase> LensEffectEmitterClass)
{
	if (LensEffectEmitterClass != NULL)
	{
		AEmitterCameraLensEffectBase* LensEffect = NULL;
		if (!GetDefault<AEmitterCameraLensEffectBase>(LensEffectEmitterClass)->bAllowMultipleInstances)
		{
			LensEffect = FindCameraLensEffect(LensEffectEmitterClass);

			if (LensEffect != NULL)
			{
				LensEffect->NotifyRetriggered();
			}
		}

		if (LensEffect == NULL)
		{
			// spawn with viewtarget as the owner so bOnlyOwnerSee works as intended
			FActorSpawnParameters SpawnInfo;
			SpawnInfo.Owner = PCOwner->GetViewTarget();
			SpawnInfo.Instigator = Instigator;
			SpawnInfo.bNoCollisionFail = true;
			SpawnInfo.ObjectFlags |= RF_Transient;	// We never want to save these into a map
			LensEffect = GetWorld()->SpawnActor<AEmitterCameraLensEffectBase>(LensEffectEmitterClass, SpawnInfo);
			if (LensEffect != NULL)
			{
				FVector CamLoc;
				FRotator CamRot;
				GetCameraViewPoint(CamLoc, CamRot);
				LensEffect->RegisterCamera(this);
				LensEffect->UpdateLocation(CamLoc, CamRot, GetFOVAngle());

				CameraLensEffects.Add(LensEffect);
			}
		}
		
		return LensEffect;
	}

	return NULL;
}