Skip to content

Commit 4dd3068

Browse files
committed
Added perfect sync detection to OpenSeeVRMDriver.
1 parent bc74658 commit 4dd3068

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

Examples/OpenSeeVRMDriver.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,9 @@ private class OpenSeeBlendShapeProxy {
296296
private bool clearPSEyes = false;
297297
private bool clearPSMouth = false;
298298
private Dictionary<BlendShapeKey, float> clearKeys = new Dictionary<BlendShapeKey, float>();
299+
300+
private bool perfectSync = false;
301+
private Dictionary<string, BlendShapeKey> clipMap = new Dictionary<string, BlendShapeKey>();
299302

300303
private VRMBlendShapeProxy proxy = null;
301304
private Animator animator = null;
@@ -305,6 +308,12 @@ private class OpenSeeBlendShapeProxy {
305308
private bool skip = false;
306309
private float globalWeight = 1f;
307310

311+
public bool HasPerfectSync() {
312+
if (proxy == null || animator == null)
313+
return false;
314+
return perfectSync;
315+
}
316+
308317
public void SetWeight(float v) {
309318
globalWeight = v;
310319
}
@@ -403,10 +412,33 @@ public void AccumulateValue(BlendShapeKey key, float weight) {
403412
else
404413
values[key] = Mathf.Max(values[key], weight);
405414
}
415+
416+
public void AccumulateValue(string key, float weight) {
417+
if (!clipMap.ContainsKey(key.ToUpper()))
418+
return;
419+
AccumulateValue(clipMap[key.ToUpper()], weight);
420+
}
406421

407422
public void UpdateAvatar(VRMBlendShapeProxy vrmBlendShapeProxy, Animator animator) {
408423
proxy = vrmBlendShapeProxy;
409424
this.animator = animator;
425+
426+
perfectSync = false;
427+
if (proxy == null)
428+
return;
429+
HashSet<string> perfectSyncNames = new HashSet<string>() { "BROWINNERUP", "BROWDOWNLEFT", "BROWDOWNRIGHT", "BROWOUTERUPLEFT", "BROWOUTERUPRIGHT", "EYELOOKUPLEFT", "EYELOOKUPRIGHT", "EYELOOKDOWNLEFT", "EYELOOKDOWNRIGHT", "EYELOOKINLEFT", "EYELOOKINRIGHT", "EYELOOKOUTLEFT", "EYELOOKOUTRIGHT", "EYEBLINKLEFT", "EYEBLINKRIGHT", "EYESQUINTRIGHT", "EYESQUINTLEFT", "EYEWIDELEFT", "EYEWIDERIGHT", "CHEEKPUFF", "CHEEKSQUINTLEFT", "CHEEKSQUINTRIGHT", "NOSESNEERLEFT", "NOSESNEERRIGHT", "JAWOPEN", "JAWFORWARD", "JAWLEFT", "JAWRIGHT", "MOUTHFUNNEL", "MOUTHPUCKER", "MOUTHLEFT", "MOUTHRIGHT", "MOUTHROLLUPPER", "MOUTHROLLLOWER", "MOUTHSHRUGUPPER", "MOUTHSHRUGLOWER", "MOUTHCLOSE", "MOUTHSMILELEFT", "MOUTHSMILERIGHT", "MOUTHFROWNLEFT", "MOUTHFROWNRIGHT", "MOUTHDIMPLELEFT", "MOUTHDIMPLERIGHT", "MOUTHUPPERUPLEFT", "MOUTHUPPERUPRIGHT", "MOUTHLOWERDOWNLEFT", "MOUTHLOWERDOWNRIGHT", "MOUTHPRESSLEFT", "MOUTHPRESSRIGHT", "MOUTHSTRETCHLEFT", "MOUTHSTRETCHRIGHT", "TONGUEOUT" };
430+
clipMap.Clear();
431+
foreach (BlendShapeClip clip in vrmBlendShapeProxy.BlendShapeAvatar.Clips) {
432+
if (clip.Preset == BlendShapePreset.Unknown && clip.BlendShapeName != null) {
433+
string name = clip.BlendShapeName.ToUpper();
434+
clipMap.Add(name, BlendShapeKey.CreateUnknown(clip.BlendShapeName));
435+
if (perfectSyncNames.Contains(name)) {
436+
perfectSyncNames.Remove(name);
437+
}
438+
}
439+
}
440+
if (perfectSyncNames.Count < 1)
441+
perfectSync = true;
410442
}
411443
}
412444

0 commit comments

Comments
 (0)