03-18-2019 11:40 PM
void SetGazeTransform(USceneComponent* sceneComp)
...the transform will point to the root object scene component that it is attached. It may desirable to tune that on larger objects to refine the point of interest.
void ALocalAvatar::LipSyncVismesReady()
{
if (UseCannedLipSyncPlayback)
{
AvatarComponent->UpdateVisemeValues(PlayBackLipSyncComponent->GetVisemes());
}
else
{
AvatarComponent->UpdateVisemeValues(LipSyncComponent->GetVisemes());
}
}
void ALocalAvatar::PreInitializeComponents()
{
Super::PreInitializeComponents();
if (UseCannedLipSyncPlayback)
{
FString playbackAssetPath = TEXT("/Game/Audio/vox_lp_01_LipSyncSequence");
auto sequence = LoadObject<UOVRLipSyncFrameSequence>(nullptr, *playbackAssetPath, nullptr, LOAD_None, nullptr);
PlayBackLipSyncComponent->Sequence = sequence;
FString AudioClip = TEXT("/Game/Audio/vox_lp_01");
auto SoundWave = LoadObject<USoundWave>(nullptr, *AudioClip, nullptr, LOAD_None, nullptr);
if (SoundWave)
{
SoundWave->bLooping = 1;
AudioComponent->Sound = SoundWave;
}
}
#if PLATFORM_WINDOWS
else
{
auto SilenceDetectionThresholdCVar = IConsoleManager::Get().FindConsoleVariable(TEXT("voice.SilenceDetectionThreshold"));
SilenceDetectionThresholdCVar->Set(0.f);
}
#endif
// TODO SW: Fetch Player Height from Oculus Platform?
BaseEyeHeight = 170.f;
AvatarComponent->SetVisibilityType(
AvatarVisibilityType == AvatarVisibility::FirstPerson
? ovrAvatarVisibilityFlag_FirstPerson
: ovrAvatarVisibilityFlag_ThirdPerson);
AvatarComponent->SetPlayerHeightOffset(BaseEyeHeight / 100.f);
AvatarComponent->SetExpressiveCapability(EnableExpressive);
AvatarComponent->SetBodyCapability(EnableBody);
AvatarComponent->SetHandsCapability(EnableHands);
AvatarComponent->SetBaseCapability(EnableBase);
AvatarComponent->SetBodyMaterial(GetOvrAvatarMaterialFromType(BodyMaterial));
AvatarComponent->SetHandMaterial(GetOvrAvatarMaterialFromType(HandsMaterial));
}
ALocalAvatar::ALocalAvatar()
{
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("LocalAvatarRoot"));
PrimaryActorTick.bCanEverTick = true;
AvatarComponent = CreateDefaultSubobject<UOvrAvatar>(TEXT("LocalAvatar"));
PlayBackLipSyncComponent = CreateDefaultSubobject<UOVRLipSyncPlaybackActorComponent>(TEXT("CannedLipSync"));
AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("LocalAvatarAudio"));
LipSyncComponent = CreateDefaultSubobject<UOVRLipSyncActorComponent>(TEXT("LocalLipSync"));
}
void ALocalAvatar::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
LipSyncComponent->OnVisemesReady.RemoveDynamic(this, &ALocalAvatar::LipSyncVismesReady);
PlayBackLipSyncComponent->OnVisemesReady.RemoveDynamic(this, &ALocalAvatar::LipSyncVismesReady);
if (!UseCannedLipSyncPlayback)
{
LipSyncComponent->Stop();
}
}
void ALocalAvatar::BeginPlay()
{
Super::BeginPlay();
uint64 UserID = FCString::Strtoui64(*OculusUserId, NULL, 10);
#if PLATFORM_ANDROID
ovrAvatarAssetLevelOfDetail lod = ovrAvatarAssetLevelOfDetail_Three;
if (AvatarComponent)
{
AvatarComponent->RequestAvatar(UserID, lod, UseCombinedMesh);
}
#else
ovrAvatarAssetLevelOfDetail lod = ovrAvatarAssetLevelOfDetail_Five;
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface();
if (IdentityInterface.IsValid())
{
OnLoginCompleteDelegateHandle = IdentityInterface->AddOnLoginCompleteDelegate_Handle(0, FOnLoginCompleteDelegate::CreateUObject(this, &ALocalAvatar::OnLoginComplete));
IdentityInterface->AutoLogin(0);
}
#endif
if (UseCannedLipSyncPlayback)
{
PlayBackLipSyncComponent->OnVisemesReady.AddDynamic(this, &ALocalAvatar::LipSyncVismesReady);
}
else
{
LipSyncComponent->OnVisemesReady.AddDynamic(this, &ALocalAvatar::LipSyncVismesReady);
LipSyncComponent->Start();
}
}
03-19-2019 10:35 AM
04-16-2019 09:56 AM