2019-12-26 14:45:42 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
2019-06-07 11:22:52 -04:00
# include "ILiveLinkSubject.h"
# include "ILiveLinkClient.h"
# include "LiveLinkFrameTranslator.h"
2019-10-04 13:11:45 -04:00
# include "LiveLinkLog.h"
2019-06-07 11:22:52 -04:00
bool ILiveLinkSubject : : EvaluateFrame ( TSubclassOf < ULiveLinkRole > InDesiredRole , FLiveLinkSubjectFrameData & OutFrame )
{
TSubclassOf < ULiveLinkRole > Role = GetRole ( ) ;
if ( Role = = nullptr )
{
2019-10-04 13:11:45 -04:00
static const FName NAME_InvalidRole = " ILiveLinkSubject_InvalidRole " ;
FLiveLinkLog : : WarningOnce ( NAME_InvalidRole , GetSubjectKey ( ) , TEXT ( " Can't evaluate frame for '%s'. No role has been set. " ) , * GetSubjectKey ( ) . SubjectName . ToString ( ) ) ;
2019-06-07 11:22:52 -04:00
return false ;
}
if ( InDesiredRole = = nullptr )
{
2019-10-04 13:11:45 -04:00
static const FName NAME_InvalidRequestedRole = " ILiveLinkSubject_InvalidRequestedRole " ;
FLiveLinkLog : : WarningOnce ( NAME_InvalidRequestedRole , GetSubjectKey ( ) , TEXT ( " Can't evaluate frame for '%s'. The requested role is invalid. " ) , * GetSubjectKey ( ) . SubjectName . ToString ( ) ) ;
2019-06-07 11:22:52 -04:00
return false ;
}
if ( ! HasValidFrameSnapshot ( ) )
{
2019-10-04 13:11:45 -04:00
static const FName NAME_HasValidFrameSnapshot = " ILiveLinkSubject_HasValidFrameSnapshot " ;
FLiveLinkLog : : InfoOnce ( NAME_HasValidFrameSnapshot , GetSubjectKey ( ) , TEXT ( " Can't evaluate frame for '%s'. No data was available. " ) , * GetSubjectKey ( ) . SubjectName . ToString ( ) ) ;
2019-06-07 11:22:52 -04:00
return false ;
}
if ( Role = = InDesiredRole | | Role - > IsChildOf ( InDesiredRole ) )
{
//Copy the current snapshot over
OutFrame . StaticData . InitializeWith ( GetFrameSnapshot ( ) . StaticData ) ;
OutFrame . FrameData . InitializeWith ( GetFrameSnapshot ( ) . FrameData ) ;
return true ;
}
2019-06-18 14:32:41 -04:00
const bool bSuccess = Translate ( this , InDesiredRole , GetFrameSnapshot ( ) . StaticData , GetFrameSnapshot ( ) . FrameData , OutFrame ) ;
if ( ! bSuccess )
{
2019-10-04 13:11:45 -04:00
static FName NAME_CantTranslate = " ILiveLinkSubject_CantTranslate " ;
NAME_CantTranslate . SetNumber ( GetTypeHash ( InDesiredRole - > GetFName ( ) ) ) ; // Create a unique FName with the role as number. ie. ILiveLinkSubject_CantTranslate_8465
FLiveLinkLog : : WarningOnce ( NAME_CantTranslate , GetSubjectKey ( ) , TEXT ( " Can't evaluate frame for '%s'. The requested role is '%s' and no translators was able to translate it. " ) , * GetSubjectKey ( ) . SubjectName . ToString ( ) , * InDesiredRole - > GetName ( ) ) ;
2019-06-18 14:32:41 -04:00
}
return bSuccess ;
2019-06-07 11:22:52 -04:00
}
bool ILiveLinkSubject : : SupportsRole ( TSubclassOf < ULiveLinkRole > InDesiredRole ) const
{
if ( GetRole ( ) = = InDesiredRole | | GetRole ( ) - > IsChildOf ( InDesiredRole ) )
{
return true ;
}
for ( ULiveLinkFrameTranslator : : FWorkerSharedPtr Translator : GetFrameTranslators ( ) )
{
check ( Translator . IsValid ( ) ) ;
if ( Translator - > CanTranslate ( InDesiredRole ) )
{
return true ;
}
}
return false ;
}
bool ILiveLinkSubject : : Translate ( const ILiveLinkSubject * InLinkSubject , TSubclassOf < ULiveLinkRole > InDesiredRole , const FLiveLinkStaticDataStruct & InStaticData , const FLiveLinkFrameDataStruct & InFrameData , FLiveLinkSubjectFrameData & OutFrame )
{
// Find one that matches exactly
bool bFound = false ;
for ( ULiveLinkFrameTranslator : : FWorkerSharedPtr Translator : InLinkSubject - > GetFrameTranslators ( ) )
{
check ( Translator . IsValid ( ) ) ;
if ( Translator - > GetToRole ( ) = = InDesiredRole )
{
Translator - > Translate ( InStaticData , InFrameData , OutFrame ) ;
bFound = true ;
break ;
}
}
if ( ! bFound )
{
for ( ULiveLinkFrameTranslator : : FWorkerSharedPtr Translator : InLinkSubject - > GetFrameTranslators ( ) )
{
if ( Translator - > CanTranslate ( InDesiredRole ) )
{
Translator - > Translate ( InStaticData , InFrameData , OutFrame ) ;
bFound = true ;
break ;
}
}
}
return bFound ;
}