Skip to content

Commit d91fa75

Browse files
committed
Add experimental support for V1 eye brow emulation
1 parent c0fd215 commit d91fa75

2 files changed

Lines changed: 65 additions & 6 deletions

File tree

ETVRTrackingModule.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ public override (bool eyeSuccess, bool expressionSuccess) Initialize(bool eyeAva
2323
_expressionMapper = new ExpressionsMapper(Logger, ref config);
2424
_oscManager = new OSCManager(Logger, _expressionMapper, ref config);
2525
_oscManager.Start();
26-
27-
26+
2827
if (_oscManager.State == OSCState.CONNECTED) return (true, true);
2928

3029
Logger.LogError("ETVR Module could not connect to the specified port.");

ExpressionStrategies/V1Mapper.cs

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,17 @@ public void handleOSCMessage(OSCMessage message)
3838

3939
private void UpdateVRCFTEyeData(ref UnifiedEyeData eyeData, ref UnifiedExpressionShape[] eyeShapes)
4040
{
41-
HandleEyeOpenness(ref eyeData, ref eyeShapes);
4241
HandleEyeGaze(ref eyeData);
42+
HandleEyeOpenness(ref eyeData, ref eyeShapes);
43+
EmulateEyeBrows(ref eyeShapes);
4344
}
4445

46+
private void HandleEyeGaze(ref UnifiedEyeData eyeData)
47+
{
48+
eyeData.Right.Gaze = new Vector2(_parameterValues["RightEyeX"], _parameterValues["EyesY"]);
49+
eyeData.Left.Gaze = new Vector2(_parameterValues["LeftEyeX"], _parameterValues["EyesY"]);
50+
}
51+
4552
private void HandleEyeOpenness(ref UnifiedEyeData eyeData, ref UnifiedExpressionShape[] eyeShapes)
4653
{
4754
// so how it works, currently we cannot output values above 1.0 and below 0.0
@@ -91,9 +98,62 @@ float squeezeThreshold
9198
}
9299
}
93100

94-
private void HandleEyeGaze(ref UnifiedEyeData eyeData)
101+
private void EmulateEyeBrows(ref UnifiedExpressionShape[] eyeShapes)
95102
{
96-
eyeData.Right.Gaze = new Vector2(_parameterValues["RightEyeX"], _parameterValues["EyesY"]);
97-
eyeData.Left.Gaze = new Vector2(_parameterValues["LeftEyeX"], _parameterValues["EyesY"]);
103+
var baseRightEyeOpenness = _parameterValues["RightEyeLidExpandedSqueeze"];
104+
var baseLeftEyeOpenness = _parameterValues["LeftEyeLidExpandedSqueeze"];
105+
106+
_emulateEyeBrow(
107+
ref eyeShapes,
108+
UnifiedExpressions.BrowLowererRight,
109+
UnifiedExpressions.BrowOuterUpRight,
110+
baseRightEyeOpenness,
111+
_config.WidenThreshold,
112+
_config.SqueezeThreshold
113+
);
114+
115+
_emulateEyeBrow(
116+
ref eyeShapes,
117+
UnifiedExpressions.BrowLowererLeft,
118+
UnifiedExpressions.BrowOuterUpLeft,
119+
baseLeftEyeOpenness,
120+
_config.WidenThreshold,
121+
_config.SqueezeThreshold
122+
);
123+
}
124+
125+
private void _emulateEyeBrow(
126+
ref UnifiedExpressionShape[] eyeShapes,
127+
UnifiedExpressions eyebrowExpressionLowerrer,
128+
UnifiedExpressions eyebrowExpressionUpper,
129+
float baseEyeOpenness,
130+
float widenThreshold,
131+
float squeezeThreshold)
132+
{
133+
if (!_config.ShouldEmulateEyebrows)
134+
return;
135+
136+
if (baseEyeOpenness >= widenThreshold)
137+
{
138+
eyeShapes[(int)eyebrowExpressionLowerrer].Weight = Utils.SmoothStep(
139+
widenThreshold,
140+
1,
141+
baseEyeOpenness
142+
);
143+
}
144+
145+
if (baseEyeOpenness <= squeezeThreshold)
146+
{
147+
eyeShapes[(int)eyebrowExpressionUpper].Weight = Utils.SmoothStep(
148+
squeezeThreshold,
149+
1,
150+
baseEyeOpenness
151+
);
152+
eyeShapes[(int)UnifiedExpressions.BrowLowererLeft].Weight = Utils.SmoothStep(
153+
squeezeThreshold,
154+
1,
155+
baseEyeOpenness
156+
);
157+
}
98158
}
99159
}

0 commit comments

Comments
 (0)