1- using Microsoft . Extensions . Logging ;
1+ using Microsoft . Extensions . Logging ;
22using VRCFaceTracking ;
33using VRCFaceTracking . Core . Params . Data ;
44using 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