Skip to content

Commit

Permalink
Merge pull request #957 from ousttrue/fix/drop_lookat_curve_param
Browse files Browse the repository at this point in the history
正規化時にLookAtのパラメーターが落ちてしまうのを修正
  • Loading branch information
ousttrue committed May 19, 2021
2 parents bc1cd34 + b8223a2 commit 0e9bc3a
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 4 deletions.
24 changes: 23 additions & 1 deletion Assets/VRM/Runtime/LookAt/CurveMapper.cs
Expand Up @@ -7,7 +7,7 @@
namespace VRM
{
[Serializable]
public class CurveMapper
public class CurveMapper : IEquatable<CurveMapper>
{
public AnimationCurve Curve = AnimationCurve.Linear(0, 0, 1.0f, 1.0f);

Expand Down Expand Up @@ -37,6 +37,12 @@ public void OnValidate()
}
}

public void Assign(CurveMapper mapper)
{
CurveXRangeDegree = mapper.CurveXRangeDegree;
CurveYRangeDegree = mapper.CurveYRangeDegree;
}

public void Apply(glTF_VRM_DegreeMap degreeMap)
{
CurveXRangeDegree = degreeMap.xRange;
Expand Down Expand Up @@ -71,5 +77,21 @@ public float Map(float src)
}
return Curve.Evaluate(src / CurveXRangeDegree) * CurveYRangeDegree;
}

public bool Equals(CurveMapper other)
{
if (CurveXRangeDegree != other.CurveXRangeDegree) return false;
if (CurveYRangeDegree != other.CurveYRangeDegree) return false;
return true;
}

public override bool Equals(object obj)
{
if (obj is CurveMapper mapper)
{
return Equals(mapper);
}
return base.Equals(obj);
}
}
}
7 changes: 7 additions & 0 deletions Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs
Expand Up @@ -228,6 +228,10 @@ public static GameObject Execute(GameObject go, bool forceTPose)
if (src != null)
{
var dst = root.AddComponent<VRMLookAtBoneApplyer>();
dst.HorizontalInner.Assign(src.HorizontalInner);
dst.HorizontalOuter.Assign(src.HorizontalOuter);
dst.VerticalUp.Assign(src.VerticalUp);
dst.VerticalDown.Assign(src.VerticalDown);
}
}
{
Expand All @@ -236,6 +240,9 @@ public static GameObject Execute(GameObject go, bool forceTPose)
if (src != null)
{
var dst = root.AddComponent<VRMLookAtBlendShapeApplyer>();
dst.Horizontal.Assign(src.Horizontal);
dst.VerticalUp.Assign(src.VerticalUp);
dst.VerticalDown.Assign(src.VerticalDown);
}
}

Expand Down
77 changes: 74 additions & 3 deletions Assets/VRM/Tests/VRMLookAtTests.cs
Expand Up @@ -31,7 +31,7 @@ public void VRMLookAtTest()
var go = loader.Root;
var fp = go.GetComponent<VRMFirstPerson>();
GameObject.DestroyImmediate(go.GetComponent<VRMLookAtBoneApplyer>());
go.AddComponent<VRMLookAtBlendShapeApplyer>();
var lookAt = go.AddComponent<VRMLookAtBlendShapeApplyer>();
bytes = VRMEditorExporter.Export(go, null, new VRMExportSettings
{
PoseFreeze = true,
Expand All @@ -40,9 +40,80 @@ public void VRMLookAtTest()

var parser2 = new GltfParser();
parser2.Parse(AliciaPath, bytes);
var loader2 = new VRMImporterContext(parser2);
using (var loader2 = new VRMImporterContext(parser2))
{
Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType);
}
}

[Test]
public void VRMLookAtCurveMapWithFreezeTest()
{
var parser = new GltfParser();
parser.ParsePath(AliciaPath);
byte[] bytes = default;
CurveMapper horizontalInner = default;
using (var loader = new VRMImporterContext(parser))
{
loader.Load();
loader.ShowMeshes();

var go = loader.Root;
var fp = go.GetComponent<VRMFirstPerson>();
var lookAt = go.GetComponent<VRMLookAtBoneApplyer>();
horizontalInner = lookAt.HorizontalInner;
bytes = VRMEditorExporter.Export(go, null, new VRMExportSettings
{
PoseFreeze = true,
});
}

var parser2 = new GltfParser();
parser2.Parse(AliciaPath, bytes);
using (var loader = new VRMImporterContext(parser2))
{
loader.Load();
loader.ShowMeshes();

Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType);
var lookAt = loader.Root.GetComponent<VRMLookAtBoneApplyer>();
Assert.AreEqual(horizontalInner.CurveXRangeDegree, lookAt.HorizontalInner.CurveXRangeDegree);
Assert.AreEqual(horizontalInner.CurveYRangeDegree, lookAt.HorizontalInner.CurveYRangeDegree);
}
}

[Test]
public void VRMLookAtCurveMapTest()
{
var parser = new GltfParser();
parser.ParsePath(AliciaPath);
byte[] bytes = default;
CurveMapper horizontalInner = default;
using (var loader = new VRMImporterContext(parser))
{
loader.Load();
loader.ShowMeshes();

var go = loader.Root;
var fp = go.GetComponent<VRMFirstPerson>();
var lookAt = go.GetComponent<VRMLookAtBoneApplyer>();
horizontalInner = lookAt.HorizontalInner;
bytes = VRMEditorExporter.Export(go, null, new VRMExportSettings
{
PoseFreeze = false,
});
}

var parser2 = new GltfParser();
parser2.Parse(AliciaPath, bytes);
using (var loader = new VRMImporterContext(parser2))
{
loader.Load();
loader.ShowMeshes();

var lookAt = loader.Root.GetComponent<VRMLookAtBoneApplyer>();
Assert.AreEqual(horizontalInner.CurveXRangeDegree, lookAt.HorizontalInner.CurveXRangeDegree);
Assert.AreEqual(horizontalInner.CurveYRangeDegree, lookAt.HorizontalInner.CurveYRangeDegree);
}
}
}
}

0 comments on commit 0e9bc3a

Please sign in to comment.