Merge pull request #2449 from ousttrue/fix/export_index_of

Fix/export index of
This commit is contained in:
ousttrue 2024-09-26 23:39:16 +09:00 committed by GitHub
commit 0e9020a8cb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 63 additions and 22 deletions

View File

@ -185,11 +185,14 @@ namespace VRM
{
VRM.firstPerson.firstPersonBone = Nodes.IndexOf(firstPerson.FirstPersonBone);
VRM.firstPerson.firstPersonBoneOffset = firstPerson.FirstPersonOffset;
VRM.firstPerson.meshAnnotations = firstPerson.Renderers.Select(x => new glTF_VRM_MeshAnnotation
{
mesh = Meshes.IndexOf(x.SharedMesh),
firstPersonFlag = x.FirstPersonFlag.ToString(),
}).ToList();
VRM.firstPerson.meshAnnotations = firstPerson.Renderers
.Select(x => new glTF_VRM_MeshAnnotation
{
mesh = Meshes.IndexOf(x.SharedMesh),
firstPersonFlag = x.FirstPersonFlag.ToString(),
})
.Where(x => x.mesh != -1)
.ToList();
}
// lookAt

View File

@ -162,7 +162,7 @@ namespace VRM
// fallback
asset.Preset = CachedEnum.ParseOrDefault<BlendShapePreset>(group.name, true);
}
asset.Values = group.binds.Select(x =>
asset.Values = group.binds.Where(x => x.mesh >= 0 && x.mesh < Meshes.Count).Select(x =>
{
var mesh = Meshes[x.mesh].Mesh;
var node = transformMeshTable[mesh];

View File

@ -8,13 +8,23 @@ namespace UniVRM10
{
public static class ExpressionExtensions
{
public static UniVRM10.MorphTargetBinding Build10(this MorphTargetBind bind, GameObject root, Vrm10Importer.ModelMap loader, VrmLib.Model model)
public static MorphTargetBinding? Build10(this MorphTargetBind bind, GameObject root, Vrm10Importer.ModelMap loader, VrmLib.Model model)
{
var libNode = model.Nodes[bind.Node.Value];
var node = loader.Nodes[libNode].transform;
var mesh = loader.Meshes[libNode.MeshGroup];
var relativePath = node.RelativePathFrom(root.transform);
return new UniVRM10.MorphTargetBinding(relativePath, bind.Index.Value, bind.Weight.Value);
if (bind.Node.TryGetValidIndex(model.Nodes.Count, out var nodeIndex))
{
var libNode = model.Nodes[nodeIndex];
if (libNode.MeshGroup == null)
{
return default;
}
var node = loader.Nodes[libNode].transform;
var relativePath = node.RelativePathFrom(root.transform);
return new MorphTargetBinding(relativePath, bind.Index.Value, bind.Weight.Value);
}
else
{
return default;
}
}
public static UniVRM10.MaterialColorBinding? Build10(this MaterialColorBind bind, IReadOnlyList<MaterialFactory.MaterialLoadInfo> materials)

View File

@ -105,7 +105,7 @@ namespace UniVRM10
}
// material and textures
var rendererComponents = root.GetComponentsInChildren<Renderer>();
var rendererComponents = root.GetComponentsInChildren<Renderer>().Where(x => x.gameObject.activeInHierarchy && x.enabled).ToArray();
{
foreach (var renderer in rendererComponents)
{

View File

@ -646,7 +646,13 @@ namespace UniVRM10
};
foreach (var f in firstPerson.Renderers)
{
vrm.FirstPerson.MeshAnnotations.Add(ExportMeshAnnotation(f, vrmController.transform, getIndex));
var annotation = ExportMeshAnnotation(f, vrmController.transform, getIndex);
if (annotation.Node < 0)
{
// maybe disabled Rendeer
continue;
}
vrm.FirstPerson.MeshAnnotations.Add(annotation);
}
}
@ -718,6 +724,15 @@ namespace UniVRM10
Func<string, int> getIndexFromRelativePath = relativePath =>
{
var rendererNode = vrmController.transform.GetFromPath(relativePath);
var renderer = rendererNode.GetComponent<Renderer>();
if (renderer == null)
{
return -1;
}
if (!renderer.enabled)
{
return -1;
}
var node = converter.Nodes[rendererNode.gameObject];
return model.Nodes.IndexOf(node);
};
@ -751,7 +766,14 @@ namespace UniVRM10
{
try
{
vrmExpression.MorphTargetBinds.Add(ExportMorphTargetBinding(b, getIndexFromRelativePath));
var binding = ExportMorphTargetBinding(b, getIndexFromRelativePath);
if (binding.Node < 0)
{
// node もしくは renderer が存在しない
continue;
}
vrmExpression.MorphTargetBinds.Add(binding);
}
catch (Exception ex)
{

View File

@ -316,7 +316,10 @@ namespace UniVRM10
if (expression.MorphTargetBinds != null)
{
clip.MorphTargetBindings = expression.MorphTargetBinds?.Select(x => x.Build10(Root, m_map, m_model))
clip.MorphTargetBindings = expression.MorphTargetBinds?
.Select(x => x.Build10(Root, m_map, m_model))
.Where(x => x.HasValue)
.Select(x => x.Value)
.ToArray();
}
else
@ -492,13 +495,16 @@ namespace UniVRM10
var fp = vrmExtension.FirstPerson;
foreach (var x in fp.MeshAnnotations)
{
var node = Nodes[x.Node.Value];
var relative = node.RelativePathFrom(Root.transform);
vrm.FirstPerson.Renderers.Add(new RendererFirstPersonFlags
if (x.Node.TryGetValidIndex(Nodes.Count, out var index))
{
FirstPersonFlag = x.Type,
Renderer = relative,
});
var node = Nodes[x.Node.Value];
var relative = node.RelativePathFrom(Root.transform);
vrm.FirstPerson.Renderers.Add(new RendererFirstPersonFlags
{
FirstPersonFlag = x.Type,
Renderer = relative,
});
}
}
}
else