Skip to content

Commit c0fd215

Browse files
committed
Add experimental support for widen and squeeze for v2 params
1 parent 26397cb commit c0fd215

1 file changed

Lines changed: 46 additions & 13 deletions

File tree

ExpressionStrategies/V2Mapper.cs

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,36 @@ public class V2Mapper : ImappingStategy
1313
"EyeY",
1414
"EyeLid"
1515
};
16-
16+
1717
private Dictionary<string, float> _parameterValues = new()
1818
{
1919
{ "EyeX", 0f },
2020
{ "EyeY", 0f },
2121
{ "EyeLid", 1f },
22-
22+
2323
{ "EyeLeftX", 0f },
2424
{ "EyeLeftY", 0f },
2525
{ "EyeRightX", 0f },
2626
{ "EyeRightY", 0f },
2727
{ "EyeLidLeft", 1f },
2828
{ "EyeLidRight", 1f },
2929
};
30-
30+
3131
private ILogger _logger;
32+
private readonly Config _config;
3233

33-
public V2Mapper(ILogger logger)
34+
public V2Mapper(ILogger logger, ref Config config)
3435
{
36+
_config = config;
3537
_logger = logger;
3638
}
39+
3740
public void handleOSCMessage(OSCMessage message)
3841
{
3942
string paramToMap = ImappingStategy.GetParamToMap(message.address);
4043
if (!_parameterValues.ContainsKey(paramToMap))
4144
return;
42-
45+
4346
_parameterValues[paramToMap] = message.value;
4447
var singleEyeMode = _singleEyeParamNames.Contains(paramToMap);
4548
UpdateVRCFTEyeData(ref UnifiedTracking.Data.Eye, ref UnifiedTracking.Data.Shapes, singleEyeMode);
@@ -50,7 +53,7 @@ private void UpdateVRCFTEyeData(ref UnifiedEyeData eyeData, ref UnifiedExpressio
5053
HandleEyeGaze(ref eyeData, isSingleEyeMode);
5154
HandleEyeOpenness(ref eyeData, ref eyeShapes, isSingleEyeMode);
5255
}
53-
56+
5457
private void HandleEyeGaze(ref UnifiedEyeData eyeData, bool isSingleEyeMode)
5558
{
5659
if (isSingleEyeMode)
@@ -65,18 +68,48 @@ private void HandleEyeGaze(ref UnifiedEyeData eyeData, bool isSingleEyeMode)
6568
eyeData.Right.Gaze = new Vector2(_parameterValues["EyeRightX"], _parameterValues["EyeRightY"]);
6669
}
6770

68-
private void HandleEyeOpenness(ref UnifiedEyeData eyeData, ref UnifiedExpressionShape[] eyeShapes, bool isSingleEyeMode = false)
71+
private void HandleEyeOpenness(ref UnifiedEyeData eyeData, ref UnifiedExpressionShape[] eyeShapes,
72+
bool isSingleEyeMode = false)
6973
{
7074
if (isSingleEyeMode)
7175
{
7276
var eyeOpenness = _parameterValues["EyeLid"];
73-
74-
eyeData.Left.Openness = eyeOpenness;
75-
eyeData.Right.Openness = eyeOpenness;
77+
78+
HandleSingleEyeOpenness(ref eyeData.Left, eyeOpenness, _config.WidenThreshold, _config.SqueezeThreshold);
79+
HandleSingleEyeOpenness(ref eyeData.Right, eyeOpenness, _config.WidenThreshold, _config.SqueezeThreshold);
7680
return;
7781
}
78-
79-
eyeData.Left.Openness = _parameterValues["EyeLidLeft"];
80-
eyeData.Right.Openness = _parameterValues["EyeLidRight"];
82+
83+
HandleSingleEyeOpenness(ref eyeData.Left, _parameterValues["EyeLidLeft"], _config.WidenThreshold,
84+
_config.SqueezeThreshold);
85+
HandleSingleEyeOpenness(ref eyeData.Right, _parameterValues["EyeLidRight"], _config.WidenThreshold,
86+
_config.SqueezeThreshold);
87+
}
88+
89+
private void HandleSingleEyeOpenness(
90+
ref UnifiedSingleEyeData eyeData,
91+
float baseOpenness,
92+
float widenThreshold,
93+
float squeezeThreshold
94+
)
95+
{
96+
eyeData.Openness = baseOpenness;
97+
if (_config.ShouldEmulateEyeWiden && baseOpenness >= widenThreshold)
98+
{
99+
eyeData.Openness = Utils.SmoothStep(
100+
widenThreshold,
101+
1.4f,
102+
baseOpenness
103+
);
104+
}
105+
106+
if (_config.ShouldEmulateEyeSquint && baseOpenness <= squeezeThreshold)
107+
{
108+
eyeData.Openness = Utils.SmoothStep(
109+
squeezeThreshold,
110+
-1.4f,
111+
baseOpenness
112+
);
113+
}
81114
}
82115
}

0 commit comments

Comments
 (0)