Skip to content

Commit

Permalink
Refactor OSC to clean things up and allow us to use template types. I…
Browse files Browse the repository at this point in the history
…nclude and utilize unmanaged rust lib (https://github.com/benaclejames/SimpleRustOSC). Lotta optimization and performance optimizations.
  • Loading branch information
benaclejames committed Mar 21, 2023
1 parent 9298941 commit a6fa75d
Show file tree
Hide file tree
Showing 18 changed files with 217 additions and 386 deletions.
Binary file modified SRanipalExtTrackingModule/ModuleLibs/SRWorks_Log.dll
Binary file not shown.
Binary file modified SRanipalExtTrackingModule/ModuleLibs/SRanipal.dll
Binary file not shown.
Binary file modified SRanipalExtTrackingModule/ModuleLibs/ViveSR_Client.dll
Binary file not shown.
Binary file modified SRanipalExtTrackingModule/ModuleLibs/libHTC_License.dll
Binary file not shown.
Binary file modified SRanipalExtTrackingModule/ModuleLibs/nanomsg.dll
Binary file not shown.
7 changes: 4 additions & 3 deletions VRCFaceTracking/ConfigParser.cs
Expand Up @@ -33,7 +33,7 @@ public class AvatarConfigSpec
public List<Parameter> parameters { get; set; }
}

public static Action OnConfigLoaded = () => { };
public static Action<int> OnConfigLoaded = (int count) => { };

public static void ParseNewAvatar(string newId)
{
Expand Down Expand Up @@ -62,10 +62,11 @@ public static void ParseNewAvatar(string newId)
Logger.Msg("Parsing config file for avatar: " + avatarConfig.name);
var parameters = avatarConfig.parameters.Where(param => param.input != null).ToArray();

int count = 0;
foreach (var parameter in UnifiedTracking.AllParameters_v2.Concat(UnifiedTracking.AllParameters_v1).ToArray())
parameter.ResetParam(parameters);
count += parameter.ResetParam(parameters);

OnConfigLoaded();
OnConfigLoaded(count);
}
}
}
62 changes: 21 additions & 41 deletions VRCFaceTracking/MainStandalone.cs
Expand Up @@ -6,6 +6,7 @@
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows;
using System.Windows.Documents;
using VRCFaceTracking.Assets.UI;
using VRCFaceTracking.OSC;
using VRCFaceTracking.Types;
Expand All @@ -31,16 +32,6 @@ public static class MainStandalone
public static OscMain OscMain;
public static UnifiedConfig unifiedConfig = new UnifiedConfig();

private static List<byte[]> ConstructMessages(IEnumerable<OSCParams.BaseParam> parameters) =>
parameters.Where(p => p.NeedsSend).Select(param =>
{
param.NeedsSend = false;
return new OscMessage(param.OutputInfo.address, param.OscType, param.ParamValue);
}).ToList();

private static IEnumerable<OSCParams.BaseParam> _relevantParams;
private static int _relevantParamsCount = 416;

public static readonly CancellationTokenSource MasterCancellationTokenSource = new CancellationTokenSource();

public static void Teardown()
Expand All @@ -60,6 +51,7 @@ public static void Teardown()

public static void Initialize()
{
var test2 = BitConverter.GetBytes(69.42);
Logger.Msg("VRCFT Initializing!");

// Parse Arguments
Expand Down Expand Up @@ -95,50 +87,38 @@ public static void Initialize()
if (!bindResults.senderSuccess)
Logger.Error("Socket failed to bind to sender port, please ensure it's not already in use by another program or specify a different one instead.");

var _relevantParams_v1 = UnifiedTracking.AllParameters_v1.SelectMany(p => p.GetBase()).Where(param => param.Relevant);
var _relevantParams_v2 = UnifiedTracking.AllParameters_v2.SelectMany(p => p.GetBase()).Where(param => param.Relevant);
_relevantParams = _relevantParams_v1.Concat(_relevantParams_v2);

ConfigParser.OnConfigLoaded += () =>
ConfigParser.OnConfigLoaded += (count) =>
{
_relevantParams_v1 = UnifiedTracking.AllParameters_v1.SelectMany(p => p.GetBase())
.Where(param => param.Relevant);
_relevantParams_v2 = UnifiedTracking.AllParameters_v2.SelectMany(p => p.GetBase())
.Where(param => param.Relevant);
_relevantParams = _relevantParams_v1.Concat(_relevantParams_v2);
Logger.Msg("Config file parsed successfully! " + _relevantParams.Count() + " parameters loaded.");
if (_relevantParams_v1.Count() > 0)
Logger.Warning(_relevantParams_v1.Count() + " legacy parameters loaded. These are undocumented and outdated parameters.");
Logger.Warning(count + " legacy parameters loaded. These are undocumented and outdated parameters.");
};

// Begin main OSC update loop
Utils.TimeBeginPeriod(1);
byte[] buffer = new byte[4096];
while (!MasterCancellationTokenSource.IsCancellationRequested)
{
Thread.Sleep(10);

if (_relevantParamsCount <= 0)
continue;
//if (_relevantParamsCount <= 0)
// continue;

UnifiedTracking.UpdateData();

var messages = ConstructMessages(_relevantParams);
while (messages.Count > 0)

// Send all messages in OSCParams.SendQueue
if (OSCParams.SendQueue.Count <= 0) continue;

var relevantMessages = OSCParams.SendQueue.ToArray();
int messageIndex = 0;
while (messageIndex < relevantMessages.Length)
{
var msgCount = 16;
var msgList = new List<OscMessage>();
while (messages.Count > 0 && msgCount+messages[0].Data.Length+4 < 4096)
{
msgList.Add(messages[0]);
msgCount += messages[0].Data.Length+4;
messages.RemoveAt(0);
}
var bundle = new OscBundle(msgList);
OscMain.Send(bundle.Data);
var length = RustLib.create_osc_bundle(buffer, relevantMessages, relevantMessages.Length,
ref messageIndex);
if (length > 4096)
throw new Exception("Bundle size is too large! This should never happen.");

OscMain.Send(buffer, length);
}
OSCParams.SendQueue.Clear();
}
}
}
Expand Down
51 changes: 0 additions & 51 deletions VRCFaceTracking/OSC/OSCBundle.cs

This file was deleted.

5 changes: 3 additions & 2 deletions VRCFaceTracking/OSC/OSCMain.cs
@@ -1,6 +1,7 @@
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading;

namespace VRCFaceTracking.OSC
Expand Down Expand Up @@ -48,7 +49,7 @@ private void Recv()
// Ignore as this is most likely a timeout exception
return;
}
var newMsg = new OscMessage<object>(buffer);
var newMsg = new OscMessage(buffer);
switch (newMsg.Address)
{
case "/avatar/change":
Expand All @@ -74,6 +75,6 @@ private void Recv()
}
}

public void Send(byte[] data) => SenderClient.Send(data, data.Length, SocketFlags.None);
public void Send(byte[] data, int length) => SenderClient.Send(data, length, SocketFlags.None);
}
}

0 comments on commit a6fa75d

Please sign in to comment.