diff --git a/Assets/VRM/Runtime/IO/VRMExporter.cs b/Assets/VRM/Runtime/IO/VRMExporter.cs index 64e77cb80..ade5cc078 100644 --- a/Assets/VRM/Runtime/IO/VRMExporter.cs +++ b/Assets/VRM/Runtime/IO/VRMExporter.cs @@ -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 diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index c567c1645..98dc2bf7a 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -162,7 +162,7 @@ namespace VRM // fallback asset.Preset = CachedEnum.ParseOrDefault(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]; diff --git a/Assets/VRM10/Runtime/IO/ExpressionExtensions.cs b/Assets/VRM10/Runtime/IO/ExpressionExtensions.cs index 18bb973eb..402a089c6 100644 --- a/Assets/VRM10/Runtime/IO/ExpressionExtensions.cs +++ b/Assets/VRM10/Runtime/IO/ExpressionExtensions.cs @@ -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 materials) diff --git a/Assets/VRM10/Runtime/IO/Model/ModelExporter.cs b/Assets/VRM10/Runtime/IO/Model/ModelExporter.cs index d8f6955ba..ea7632a19 100644 --- a/Assets/VRM10/Runtime/IO/Model/ModelExporter.cs +++ b/Assets/VRM10/Runtime/IO/Model/ModelExporter.cs @@ -105,7 +105,7 @@ namespace UniVRM10 } // material and textures - var rendererComponents = root.GetComponentsInChildren(); + var rendererComponents = root.GetComponentsInChildren().Where(x => x.gameObject.activeInHierarchy && x.enabled).ToArray(); { foreach (var renderer in rendererComponents) { diff --git a/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs b/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs index efa2ecfbb..6634b8b39 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs @@ -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 getIndexFromRelativePath = relativePath => { var rendererNode = vrmController.transform.GetFromPath(relativePath); + var renderer = rendererNode.GetComponent(); + 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) { diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index be77bb089..f458eff2e 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -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