diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshData.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshData.cs
index 683b63c42..0a150b360 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshData.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshData.cs
@@ -30,6 +30,7 @@ namespace UniGLTF
public bool HasNormal { get; private set; } = true;
public string Name { get; private set; }
+ public bool AssignBoneWeight { get; private set; }
public MeshData(int vertexCapacity, int indexCapacity)
{
@@ -318,6 +319,7 @@ namespace UniGLTF
var texCoords1 = primitives.GetTexCoords1(data, positions.Length);
var colors = primitives.GetColors(data, positions.Length);
var skinning = SkinningInfo.Create(data, gltfMesh, primitives);
+ AssignBoneWeight = skinning.AssignBoneWeight;
CheckAttributeUsages(primitives);
@@ -449,6 +451,7 @@ namespace UniGLTF
var texCoords1 = primitives.GetTexCoords1(data, positions.Length);
var colors = primitives.GetColors(data, positions.Length);
var skinning = SkinningInfo.Create(data, gltfMesh, primitives);
+ AssignBoneWeight = skinning.AssignBoneWeight;
CheckAttributeUsages(primitives);
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs
index adfb0c100..906d71e47 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs
@@ -137,7 +137,8 @@ namespace UniGLTF
var result = new MeshWithMaterials
{
Mesh = mesh,
- Materials = data.MaterialIndices.Select(materialFromIndex).ToArray()
+ Materials = data.MaterialIndices.Select(materialFromIndex).ToArray(),
+ AssignBoneWeight = data.AssignBoneWeight,
};
await awaitCaller.NextFrame();
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshWithMaterials.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshWithMaterials.cs
index 42c2e11d4..200bf6ae7 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshWithMaterials.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshWithMaterials.cs
@@ -9,7 +9,13 @@ namespace UniGLTF
public Mesh Mesh;
public Material[] Materials;
+ ///
+ /// BoneWeight が無い && BlendShape が有るの場合に、BoneWeightを付与する。
+ /// 付与した場合に true になる。
+ ///
+ public bool AssignBoneWeight = false;
+
// 複数のノードから参照されうる
- public List Renderers=new List(); // SkinnedMeshRenderer or MeshRenderer
+ public List Renderers = new List(); // SkinnedMeshRenderer or MeshRenderer
}
}
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/SkinningInfo.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/SkinningInfo.cs
index 640551fb1..9737779cc 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/SkinningInfo.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/SkinningInfo.cs
@@ -8,8 +8,7 @@ namespace UniGLTF
public static SkinningInfo Create(GltfData data, glTFMesh mesh, glTFPrimitives primitives)
{
- // var hasMorphTarget = HasMorphTarget(mesh);
- var hasMorphTarget = false;
+ var hasMorphTarget = HasMorphTarget(mesh);
var positions = data.GLTF.accessors[primitives.attributes.POSITION];
var skinning = new SkinningInfo
diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/NodeImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/NodeImporter.cs
index 48f646e2e..b40436ae7 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/IO/NodeImporter.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/NodeImporter.cs
@@ -119,6 +119,20 @@ namespace UniGLTF
renderer.sharedMaterials = mesh.Materials;
// invisible in loading
renderer.enabled = false;
+
+ if (mesh.AssignBoneWeight)
+ {
+ renderer.bones = new[] { renderer.transform };
+
+ //
+ // calc default matrices
+ // https://docs.unity3d.com/ScriptReference/Mesh-bindposes.html
+ //
+ var meshCoords = renderer.transform;
+ var calculatedBindPoses = renderer.bones.Select(bone => bone.worldToLocalMatrix * meshCoords.localToWorldMatrix).ToArray();
+ mesh.Mesh.bindposes = calculatedBindPoses;
+ }
+
mesh.Renderers.Add(renderer);
}
}