Skip to content

Commit

Permalink
Merge pull request #330 from Kohei-Yanagida/feature_suppress_blendsha…
Browse files Browse the repository at this point in the history
…pe_gc

suppress blendshape gabage collection
  • Loading branch information
ousttrue authored Dec 12, 2019
2 parents 9de04a3 + 93c688e commit 03f96bd
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 19 deletions.
23 changes: 19 additions & 4 deletions Assets/VRM/UniVRM/Editor/Tests/VRMBlendShapeKeyTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,31 @@ public void KeyTest()
{
var key = new BlendShapeKey("Blink", BlendShapePreset.Blink);

Assert.AreEqual(key, new BlendShapeKey("blink"));
Assert.AreEqual(key, new BlendShapeKey("Blink", BlendShapePreset.Blink));
Assert.AreEqual(key, new BlendShapeKey(BlendShapePreset.Blink));
Assert.AreEqual(key, new BlendShapeKey("xxx", BlendShapePreset.Blink));

var dict = new Dictionary<BlendShapeKey, float>();
dict[new BlendShapeKey("xxx", BlendShapePreset.Blink)] = 1.0f;
dict[key] = 1.0f;

Assert.IsTrue(dict.ContainsKey(new BlendShapeKey("blink")));
Assert.IsTrue(dict.ContainsKey(new BlendShapeKey("Blink",BlendShapePreset.Blink)));
Assert.IsTrue(dict.ContainsKey(new BlendShapeKey(BlendShapePreset.Blink)));
Assert.IsTrue(dict.ContainsKey(new BlendShapeKey("xxx", BlendShapePreset.Blink)));

dict.Clear();

var key2 = new BlendShapeKey("Blink"); // name: Blink, Preset: Unknown
dict[key2] = 1.0f;

Assert.AreEqual( key2, new BlendShapeKey("Blink", BlendShapePreset.Unknown));
Assert.AreNotEqual(key2, new BlendShapeKey("blink"));
Assert.AreNotEqual(key2, new BlendShapeKey("Blink", BlendShapePreset.Blink));
Assert.AreNotEqual(key2, new BlendShapeKey(BlendShapePreset.Blink));

Assert.IsFalse(dict.ContainsKey(new BlendShapeKey("blink")));
Assert.IsFalse(dict.ContainsKey(new BlendShapeKey("Blink",BlendShapePreset.Blink)));
Assert.IsFalse(dict.ContainsKey(new BlendShapeKey(BlendShapePreset.Blink)));

}
}
}
}
64 changes: 49 additions & 15 deletions Assets/VRM/UniVRM/Scripts/BlendShape/BlendShapeKey.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,34 @@
using System;

using System.Collections.Generic;

namespace VRM
{
[Serializable]
public struct BlendShapeKey : IEquatable<BlendShapeKey>, IComparable<BlendShapeKey>
{
public string Name;
/// <summary>
/// Enum.ToString() のGC回避用キャッシュ
/// </summary>
private static readonly Dictionary<BlendShapePreset, string> m_presetNameDictionary =
new Dictionary<BlendShapePreset, string>();


/// <summary>
/// BlendShapePresetと同名の名前を持つ独自に追加したBlendShapeを区別するためのprefix
/// </summary>
private static readonly string UnknownPresetPrefix = "Unknown_";

private string m_name;

public string Name
{
get { return m_name.ToUpper(); }
}

public BlendShapePreset Preset;

string m_id;

string ID
{
get
Expand All @@ -18,42 +37,56 @@ string ID
{
if (Preset != BlendShapePreset.Unknown)
{
m_id = Preset.ToString().ToUpper();
if (m_presetNameDictionary.ContainsKey(Preset))
{
m_id = m_presetNameDictionary[Preset];
}
else
{
m_presetNameDictionary.Add(Preset, Preset.ToString());
m_id = m_presetNameDictionary[Preset];
}
}
else
{
m_id = Name;
m_id = UnknownPresetPrefix + m_name;
}
}

return m_id;
}
}

public BlendShapeKey(string name) : this(name, BlendShapePreset.Unknown)
public BlendShapeKey(BlendShapePreset preset) : this(preset.ToString(), preset)
{
}

public BlendShapeKey(BlendShapePreset preset) : this(preset.ToString(), BlendShapePreset.Unknown)
public BlendShapeKey(string name, BlendShapePreset preset = BlendShapePreset.Unknown)
{
}

public BlendShapeKey(string name, BlendShapePreset preset)
{
Name = name.ToUpper();
m_name = name;
Preset = preset;

if (Preset != BlendShapePreset.Unknown)
{
m_id = Preset.ToString().ToUpper();
if (m_presetNameDictionary.ContainsKey((Preset)))
{
m_id = m_presetNameDictionary[Preset];
}
else
{
m_presetNameDictionary.Add(Preset, Preset.ToString());
m_id = m_presetNameDictionary[Preset];
}
}
else
{
m_id = Name;
m_id = UnknownPresetPrefix + m_name;
}
}

public override string ToString()
{
return ID;
return ID.Replace(UnknownPresetPrefix, "").ToUpper();
}

public bool Equals(BlendShapeKey other)
Expand All @@ -65,7 +98,7 @@ public override bool Equals(object obj)
{
if (obj is BlendShapeKey)
{
return Equals((BlendShapeKey)obj);
return Equals((BlendShapeKey) obj);
}
else
{
Expand All @@ -84,6 +117,7 @@ public static BlendShapeKey CreateFrom(BlendShapeClip clip)
{
return default(BlendShapeKey);
}

return new BlendShapeKey(clip.BlendShapeName, clip.Preset);
}

Expand Down

0 comments on commit 03f96bd

Please sign in to comment.