Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/OvrAvatarRemoteDriver.cs
2026-02-21 16:45:37 +08:00

104 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using Oculus.Avatar;
using UnityEngine;
public class OvrAvatarRemoteDriver : OvrAvatarDriver
{
private Queue<OvrAvatarPacket> packetQueue = new Queue<OvrAvatarPacket>();
private IntPtr CurrentSDKPacket = IntPtr.Zero;
private float CurrentPacketTime;
private const int MinPacketQueue = 1;
private const int MaxPacketQueue = 4;
private int CurrentSequence = -1;
private bool isStreaming;
private OvrAvatarPacket currentPacket;
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;
}
}
private void UpdateFromSDKPacket(IntPtr sdkAvatar)
{
if (CurrentSDKPacket == IntPtr.Zero && packetQueue.Count >= 1)
{
CurrentSDKPacket = packetQueue.Dequeue().ovrNativePacket;
}
if (!(CurrentSDKPacket != IntPtr.Zero))
{
return;
}
float num = CAPI.ovrAvatarPacket_GetDurationSeconds(CurrentSDKPacket);
CAPI.ovrAvatar_UpdatePoseFromPacket(sdkAvatar, CurrentSDKPacket, Mathf.Min(num, CurrentPacketTime));
CurrentPacketTime += Time.deltaTime;
if (CurrentPacketTime > num)
{
CAPI.ovrAvatarPacket_Free(CurrentSDKPacket);
CurrentSDKPacket = IntPtr.Zero;
CurrentPacketTime -= num;
while (packetQueue.Count > 4)
{
packetQueue.Dequeue();
}
}
}
private void UpdateFromUnityPacket(IntPtr sdkAvatar)
{
if (!isStreaming && packetQueue.Count > 1)
{
currentPacket = packetQueue.Dequeue();
isStreaming = true;
}
if (!isStreaming)
{
return;
}
CurrentPacketTime += Time.deltaTime;
while (CurrentPacketTime > currentPacket.Duration)
{
if (packetQueue.Count == 0)
{
CurrentPose = currentPacket.FinalFrame;
CurrentPacketTime = 0f;
currentPacket = null;
isStreaming = false;
return;
}
while (packetQueue.Count > 4)
{
packetQueue.Dequeue();
}
CurrentPacketTime -= currentPacket.Duration;
currentPacket = packetQueue.Dequeue();
}
CurrentPose = currentPacket.GetPoseFrame(CurrentPacketTime);
UpdateTransformsFromPose(sdkAvatar);
}
}