01-29-2018 12:31 PM
01-29-2018 02:51 PM
02-05-2018 02:05 PM
static const float DISTANCE_SCALE = 0.01f;
FORCEINLINE FVector ToUnrealVector(const ovrAudioVector3f& InVec)
{
return FVector(-InVec.z, InVec.x, InVec.y);
}
FORCEINLINE ovrAudioVector3f ToOVRVector(const FVector& InVec)
{
ovrAudioVector3f Out = { InVec.Y, InVec.Z, -InVec.X };
return Out;
}
static UWorld* GetMainWorld()
{
TArray<APlayerController*> playerList;
GEngine->GetAllLocalPlayerControllers(playerList);
return (playerList.Num() > 0) ? playerList[0]->GetWorld() : nullptr;
}
static void OculusAudioRayCast(ovrAudioVector3f origin, ovrAudioVector3f direction, ovrAudioVector3f* hit, ovrAudioVector3f* normal)
{
auto World = GetMainWorld();
if (World != nullptr)
{
FVector Start = ToUnrealVector(origin) / DISTANCE_SCALE;
FVector End = Start + (ToUnrealVector(direction) * 100000.0f) / DISTANCE_SCALE;
FHitResult Hit;
World->LineTraceSingleByChannel(Hit, Start, End, ECC_Visibility);
*hit = (ovrAudioVector3f)(ToOVRVector(Hit.ImpactPoint* DISTANCE_SCALE));
*normal = (ovrAudioVector3f)(ToOVRVector(Hit.ImpactNormal* DISTANCE_SCALE));
}
}
ovrResult Result = ovrAudio_UpdateRoomModel(OvrAudioContext);
auto World = GetMainWorld();
if (World != nullptr)
{
// draw room box
ovrAudioVector3f Position;
float Dimensions[3], Coefficients[6];
Result = ovrAudio_GetRoomDimensions(OvrAudioContext, Dimensions, Coefficients, &Position);
FVector Center = ToUnrealVector(Position) / DISTANCE_SCALE;
FVector Extent(Dimensions[2], Dimensions[0], Dimensions[1]);
Extent /= 2.0f; // half dimensions
Extent /= DISTANCE_SCALE;
Extent *= 0.99f; // Make it a little smaller to prevent z-fighting
DrawDebugBox(World, Center, Extent, FColor::Purple);
const int HIT_COUNT_MAX = 2048;
static ovrAudioVector3f Points[HIT_COUNT_MAX] = { 0 };
static ovrAudioVector3f Normals[HIT_COUNT_MAX] = { 0 };
// draw hit points
Result = ovrAudio_GetRaycastHits(OvrAudioContext, Points, Normals, HIT_COUNT_MAX);
for (int i = 0; i < HIT_COUNT_MAX; ++i)
{
FVector Position = ToUnrealVector(Points) / DISTANCE_SCALE;
DrawDebugPoint(World, Position, 10.0f, FColor::Green);
FVector LineEnd = Position + ToUnrealVector(Normals) * 3000.0f;
DrawDebugLine(World, Position, LineEnd, FColor::Emerald);
}
}
03-09-2018 12:08 PM
03-13-2018 07:59 AM
//Typedefs copied from the OculusSpatializerFMOD.h file
#include "OVR_Audio_DynamicRoom.h"
#include <stdint.h>
#ifndef OVR_RESULT_DEFINED
#define OVR_RESULT_DEFINED
typedef int32_t ovrResult;
#endif
//Handle to the dll
void* OVRAudioDLLHandle;
//Typedefs for the function calls, there are more methods exposed, but we only need those for now
typedef ovrResult(*_OSP_FMOD_GetRaycastHits)(ovrAudioVector3f points[], ovrAudioVector3f normals[], int length);
typedef ovrResult(*_OSP_FMOD_AssignRayCastCallback)(OVRA_RAYCAST_CALLBACK callback, void* pctx);
typedef ovrResult(*_OSP_FMOD_UpdateRoomModel)(float wetLevel);
typedef ovrResult(*_OSP_FMOD_GetRoomDimensions)(float roomDimensions[], float reflectionsCoefs[], ovrAudioVector3f* position);
_OSP_FMOD_GetRaycastHits OSP_FMOD_GetRaycastHits;
_OSP_FMOD_AssignRayCastCallback OSP_FMOD_AssignRayCastCallback;
_OSP_FMOD_UpdateRoomModel OSP_FMOD_UpdateRoomModel;
_OSP_FMOD_GetRoomDimensions OSP_FMOD_GetRoomDimensions;
//Raycast callback
static void OculusAudioRayCast(ovrAudioVector3f origin, ovrAudioVector3f direction, ovrAudioVector3f* hit, ovrAudioVector3f* normal, void* pctx);
FString DLLFilePath = FPaths::ProjectPluginsDir() + "/FMODStudio/Binaries/Win64/OculusSpatializerFMOD.dll";
//Load the dll
FString DLLFilePath = FPaths::ProjectPluginsDir() + "/FMODStudio/Binaries/Win64/OculusSpatializerFMOD.dll";
if (!FPaths::FileExists(DLLFilePath))
{
UE_LOG(LogTemp, Error, TEXT("DLL file does not exist %s"), *DLLFilePath);
return;
}
OVRAudioDLLHandle = FPlatformProcess::GetDllHandle(*DLLFilePath);
if (OVRAudioDLLHandle == nullptr)
{
UE_LOG(LogTemp, Error, TEXT("Could not get dll handle for %s"), *DLLFilePath);
return;
}
//Get all the needed function handles
OSP_FMOD_GetRaycastHits = (_OSP_FMOD_GetRaycastHits)FPlatformProcess::GetDllExport(OVRAudioDLLHandle, *FString("OSP_FMOD_GetRaycastHits"));
if (OSP_FMOD_GetRaycastHits == nullptr)
{
UE_LOG(LogTemp, Error, TEXT("Could not get proc handle for OSP_FMOD_GetRaycastHits"));
}
OSP_FMOD_AssignRayCastCallback = (_OSP_FMOD_AssignRayCastCallback)FPlatformProcess::GetDllExport(OVRAudioDLLHandle, *FString("OSP_FMOD_AssignRayCastCallback"));
if (OSP_FMOD_AssignRayCastCallback == nullptr)
{
UE_LOG(LogTemp, Error, TEXT("Could not get proc handle for OSP_FMOD_AssignRayCastCallback"));
}
OSP_FMOD_UpdateRoomModel = (_OSP_FMOD_UpdateRoomModel)FPlatformProcess::GetDllExport(OVRAudioDLLHandle, *FString("OSP_FMOD_UpdateRoomModel"));
if (OSP_FMOD_UpdateRoomModel == nullptr)
{
UE_LOG(LogTemp, Error, TEXT("Could not get proc handle for OSP_FMOD_UpdateRoomModel"));
}
OSP_FMOD_GetRoomDimensions = (_OSP_FMOD_GetRoomDimensions)FPlatformProcess::GetDllExport(OVRAudioDLLHandle, *FString("OSP_FMOD_GetRoomDimensions"));
if (OSP_FMOD_GetRoomDimensions == nullptr)
{
UE_LOG(LogTemp, Error, TEXT("Could not get proc handle for OSP_FMOD_GetRoomDimensions"));
}
//Register the callback
OVRA_RAYCAST_CALLBACK Callback = &OculusAudioRayCast;
OSP_FMOD_AssignRayCastCallback(Callback, this);
//Example call
ovrResult Result = OSP_FMOD_UpdateRoomModel(Wetness);
OSP_FMOD_GetRaycastHits = nullptr;
OSP_FMOD_AssignRayCastCallback = nullptr;
OSP_FMOD_UpdateRoomModel = nullptr;
OSP_FMOD_GetRoomDimensions = nullptr;
FPlatformProcess::FreeDllHandle(OVRAudioDLLHandle);
OVRAudioDLLHandle = nullptr;
03-21-2018 04:55 AM