AI Sync initial changes

This commit is contained in:
Aaro Varis
2025-03-09 21:42:39 +02:00
parent adbd7f4704
commit 20a624fb0f
19 changed files with 311 additions and 73 deletions

View File

@@ -17,13 +17,15 @@ using BoneSync.Data;
using StressLevelZero.Interaction;
using UnhollowerBaseLib;
using BoneSync.Patching;
using BoneSync.Sync.Components;
using Oculus.Platform.Models;
namespace BoneSync.Player
{
internal class PlayerRig
{
private const float RIG_SYNC_FPS = 30;
private const float RIG_SYNC_FPS = Syncable.SYNC_FPS;
public static AssetBundle rigBundle;
private static float _lastLocalSyncTime = 0;
@@ -57,15 +59,18 @@ namespace BoneSync.Player
{
playerRig.UpdateIK();
}
if (Time.time - _lastLocalSyncTime > 1 / RIG_SYNC_FPS)
{
SendLocalPlayerSync();
_lastLocalSyncTime = Time.time;
}
}
public static void LocalSyncTick()
{
if (Time.realtimeSinceStartup - _lastLocalSyncTime > 1 / RIG_SYNC_FPS)
{
SendLocalPlayerSync();
_lastLocalSyncTime = Time.realtimeSinceStartup;
}
}
private void SetFingerCurl(Handedness handedness, SimpleFingerCurl fingerCurl)
{
characterAnimationManager.ApplyFingerCurl(handedness, 1f - fingerCurl.thumb, 1f - fingerCurl.index, 1f - fingerCurl.middle, 1f - fingerCurl.ring, 1f - fingerCurl.pinky);
@@ -82,6 +87,12 @@ namespace BoneSync.Player
SetFingerCurl(Handedness.LEFT, playerSyncInfo.leftHandFingerCurl);
SetFingerCurl(Handedness.RIGHT, playerSyncInfo.rightHandFingerCurl);
UpdatePose(Handedness.LEFT, playerSyncInfo.poseIndexLeft);
UpdatePose(Handedness.RIGHT, playerSyncInfo.poseIndexRight);
UpdatePoseRadius(Handedness.LEFT, playerSyncInfo.poseRadiusLeft);
UpdatePoseRadius(Handedness.RIGHT, playerSyncInfo.poseRadiusRight);
}
public void UpdatePose(Handedness hand, int index)
@@ -97,21 +108,34 @@ namespace BoneSync.Player
public void UpdatePoseRadius(Handedness hand, float radius) => characterAnimationManager?.SetCylinderRadius(hand, radius);
private static GameObject localPlayerRig;
private static Transform localRigRoot;
private static Transform localRigHeadTransform;
private static Transform localRigLeftHandTransform;
private static Transform localRigRightHandTransform;
public static void SetLocalRigReferences()
{
if (localPlayerRig != null) return;
localPlayerRig = GameObject.Find("[RigManager (Default Brett)]/[SkeletonRig (GameWorld Brett)]");
localRigRoot = localPlayerRig.transform;
localRigHeadTransform = localRigRoot.Find("Head");
localRigLeftHandTransform = localRigRoot.Find("Hand (left)");
localRigRightHandTransform = localRigRoot.Find("Hand (right)");
}
public static PlayerSyncInfo? GetLocalSyncInfo()
{
GameObject localPlayerRig = GameObject.Find("[RigManager (Default Brett)]/[SkeletonRig (GameWorld Brett)]");
SetLocalRigReferences();
if (localPlayerRig == null)
{
MelonLogger.Msg("Local player rig not found");
return null;
}
Transform root = localPlayerRig.transform;
Transform localHeadTransform = root.Find("Head");
Transform localLeftHandTransform = root.Find("Hand (left)");
Transform localRightHandTransform = root.Find("Hand (right)");
if (localHeadTransform == null || localLeftHandTransform == null || localRightHandTransform == null)
if (localRigHeadTransform == null || localRigLeftHandTransform == null || localRigRightHandTransform == null)
{
MelonLogger.Msg("Local player rig components not found");
return null;
@@ -119,10 +143,10 @@ namespace BoneSync.Player
PlayerSyncInfo playerSyncInfo = new PlayerSyncInfo()
{
rootPos = root.position,
headPos = new SimpleSyncTransform(localHeadTransform),
leftHandPos = new SimpleSyncTransform(localLeftHandTransform),
rightHandPos = new SimpleSyncTransform(localRightHandTransform),
rootPos = localRigRoot.position,
headPos = new SimpleSyncTransform(localRigHeadTransform),
leftHandPos = new SimpleSyncTransform(localRigLeftHandTransform),
rightHandPos = new SimpleSyncTransform(localRigRightHandTransform),
//leftHandFingerCurl = new SimpleFingerCurl(PlayerScripts.playerLeftHand.fingerCurl),
//rightHandFingerCurl = new SimpleFingerCurl(PlayerScripts.playerRightHand.fingerCurl)
poseIndexLeft = SkeletonHandPatches.poseIndexLeft,
@@ -142,7 +166,7 @@ namespace BoneSync.Player
private static void SendLocalPlayerSync()
{
if (!BoneSync.lobby.IsConnected()) return;
if (!BoneSync.IsConnected) return;
//MelonLogger.Msg("Sending local player sync");
PlayerSyncInfo? playerSyncInfo = GetLocalSyncInfo();
if (!playerSyncInfo.HasValue) return;