Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

121 lines
3.6 KiB

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using Oculus.Avatar;
public class OvrAvatarRemoteDriver : OvrAvatarDriver
{
Queue<OvrAvatarPacket> packetQueue = new Queue<OvrAvatarPacket>();
IntPtr CurrentSDKPacket = IntPtr.Zero;
float CurrentPacketTime = 0f;
const int MinPacketQueue = 1;
const int MaxPacketQueue = 4;
int CurrentSequence = -1;
// Used for legacy Unity only packet blending
bool isStreaming = false;
OvrAvatarPacket currentPacket = null;
public void QueuePacket(int sequence, OvrAvatarPacket packet)
{
if (sequence > CurrentSequence)
{
CurrentSequence = sequence;
packetQueue.Enqueue(packet);
}
}
public override void UpdateTransforms(IntPtr sdkAvatar)
{
switch(Mode)
{
case PacketMode.SDK:
UpdateFromSDKPacket(sdkAvatar);
break;
case PacketMode.Unity:
UpdateFromUnityPacket(sdkAvatar);
break;
default:
break;
}
}
private void UpdateFromSDKPacket(IntPtr sdkAvatar)
{
if (CurrentSDKPacket == IntPtr.Zero && packetQueue.Count >= MinPacketQueue)
{
CurrentSDKPacket = packetQueue.Dequeue().ovrNativePacket;
}
if (CurrentSDKPacket != IntPtr.Zero)
{
float PacketDuration = CAPI.ovrAvatarPacket_GetDurationSeconds(CurrentSDKPacket);
CAPI.ovrAvatar_UpdatePoseFromPacket(sdkAvatar, CurrentSDKPacket, Mathf.Min(PacketDuration, CurrentPacketTime));
CurrentPacketTime += Time.deltaTime;
if (CurrentPacketTime > PacketDuration)
{
CAPI.ovrAvatarPacket_Free(CurrentSDKPacket);
CurrentSDKPacket = IntPtr.Zero;
CurrentPacketTime = CurrentPacketTime - PacketDuration;
//Throw away packets deemed too old.
while (packetQueue.Count > MaxPacketQueue)
{
packetQueue.Dequeue();
}
}
}
}
private void UpdateFromUnityPacket(IntPtr sdkAvatar)
{
// If we're not currently streaming, check to see if we've buffered enough
if (!isStreaming && packetQueue.Count > MinPacketQueue)
{
currentPacket = packetQueue.Dequeue();
isStreaming = true;
}
// If we are streaming, update our pose
if (isStreaming)
{
CurrentPacketTime += Time.deltaTime;
// If we've elapsed past our current packet, advance
while (CurrentPacketTime > currentPacket.Duration)
{
// If we're out of packets, stop streaming and
// lock to the final frame
if (packetQueue.Count == 0)
{
CurrentPose = currentPacket.FinalFrame;
CurrentPacketTime = 0.0f;
currentPacket = null;
isStreaming = false;
return;
}
while (packetQueue.Count > MaxPacketQueue)
{
packetQueue.Dequeue();
}
// Otherwise, dequeue the next packet
CurrentPacketTime -= currentPacket.Duration;
currentPacket = packetQueue.Dequeue();
}
// Compute the pose based on our current time offset in the packet
CurrentPose = currentPacket.GetPoseFrame(CurrentPacketTime);
UpdateTransformsFromPose(sdkAvatar);
}
}
}