Skip to content

Commit 7db6035

Browse files
committed
Add eyebrow direct support
1 parent e164c81 commit 7db6035

2 files changed

Lines changed: 54 additions & 5 deletions

File tree

ETVRTrackingModule.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net7.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Platforms>AnyCPU;x64</Platforms>
77
<Nullable>enable</Nullable>

ExpressionStrategies/V2Mapper.cs

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Microsoft.Extensions.Logging;
1+
using Microsoft.Extensions.Logging;
22
using VRCFaceTracking;
33
using VRCFaceTracking.Core.Params.Data;
44
using VRCFaceTracking.Core.Params.Expressions;
@@ -12,7 +12,8 @@ public class V2Mapper : BaseParamMapper
1212
{
1313
"EyeX",
1414
"EyeY",
15-
"EyeLid"
15+
"EyeLid",
16+
"BrowExpression"
1617
};
1718

1819
private Dictionary<string, float> _parameterValues = new()
@@ -27,7 +28,10 @@ public class V2Mapper : BaseParamMapper
2728
{ "EyeRightY", 0f },
2829
{ "EyeLidLeft", 1f },
2930
{ "EyeLidRight", 1f },
30-
{ "PupilDilation", 0f },
31+
{ "PupilDilation", 0f },
32+
{ "BrowExpression", 0.5f },
33+
{ "BrowExpressionLeft", 0.5f },
34+
{ "BrowExpressionRight", 0.5f },
3135
};
3236

3337
private readonly string[] _gazeParameters =
@@ -73,9 +77,54 @@ public override void UpdateVRCFTEyeData(ref UnifiedEyeData eyeData, ref UnifiedE
7377
HandleEyeGaze(ref eyeData, _isSingleEye);
7478
HandleEyeDilation(ref eyeData);
7579
HandleEyeOpenness(ref eyeData, ref eyeShapes, _isSingleEye);
80+
HandleEyebrows(ref eyeShapes, _isSingleEye);
7681
EmulateEyebrows(ref eyeShapes, _isSingleEye);
7782
}
7883

84+
private void HandleEyebrows(ref UnifiedExpressionShape[] eyeShapes, bool isSingleEyeMode = false)
85+
{
86+
if (isSingleEyeMode)
87+
{
88+
var browExp = _parameterValues["BrowExpression"];
89+
MapBrowExpression(ref eyeShapes, browExp, true);
90+
MapBrowExpression(ref eyeShapes, browExp, false);
91+
return;
92+
}
93+
94+
MapBrowExpression(ref eyeShapes, _parameterValues["BrowExpressionRight"], true);
95+
MapBrowExpression(ref eyeShapes, _parameterValues["BrowExpressionLeft"], false);
96+
}
97+
98+
private void MapBrowExpression(ref UnifiedExpressionShape[] eyeShapes, float browExp, bool isRight)
99+
{
100+
float lowerWeight = 0f;
101+
float raiseWeight = 0f;
102+
103+
if (browExp < 0.5f)
104+
{
105+
lowerWeight = (0.5f - browExp) * 2f;
106+
}
107+
else if (browExp > 0.5f)
108+
{
109+
raiseWeight = (browExp - 0.5f) * 2f;
110+
}
111+
112+
if (isRight)
113+
{
114+
eyeShapes[(int)UnifiedExpressions.BrowLowererRight].Weight = lowerWeight;
115+
eyeShapes[(int)UnifiedExpressions.BrowPinchRight].Weight = lowerWeight;
116+
eyeShapes[(int)UnifiedExpressions.BrowInnerUpRight].Weight = raiseWeight;
117+
eyeShapes[(int)UnifiedExpressions.BrowOuterUpRight].Weight = raiseWeight;
118+
}
119+
else
120+
{
121+
eyeShapes[(int)UnifiedExpressions.BrowLowererLeft].Weight = lowerWeight;
122+
eyeShapes[(int)UnifiedExpressions.BrowPinchLeft].Weight = lowerWeight;
123+
eyeShapes[(int)UnifiedExpressions.BrowInnerUpLeft].Weight = raiseWeight;
124+
eyeShapes[(int)UnifiedExpressions.BrowOuterUpLeft].Weight = raiseWeight;
125+
}
126+
}
127+
79128
private void HandleEyeGaze(ref UnifiedEyeData eyeData, bool isSingleEyeMode)
80129
{
81130
if (isSingleEyeMode)

0 commit comments

Comments
 (0)