public void Apply(UniHumanoid.AvatarDescription desc, List <Transform> nodes) { armStretch = desc.armStretch; legStretch = desc.legStretch; upperArmTwist = desc.upperArmTwist; lowerArmTwist = desc.lowerArmTwist; upperLegTwist = desc.upperLegTwist; lowerLegTwist = desc.lowerArmTwist; feetSpacing = desc.feetSpacing; hasTranslationDoF = desc.hasTranslationDoF; foreach (var x in desc.human) { var key = x.humanBone.FromHumanBodyBone(); var found = humanBones.FirstOrDefault(y => y.vrmBone == key); if (found == null) { found = new glTF_VRM_HumanoidBone { vrmBone = key }; humanBones.Add(found); } found.node = nodes.FindIndex(y => y.name == x.boneName); found.useDefaultValues = x.useDefaultValues; found.axisLength = x.axisLength; found.center = x.center; found.max = x.max; found.min = x.min; } }
public override void Export(MeshExportSettings configuration) { base.Export(configuration); // avatar var animator = Copy.GetComponent <Animator>(); if (animator != null) { var humanoid = Copy.GetComponent <VRMHumanoidDescription>(); UniHumanoid.AvatarDescription description = null; var nodes = Copy.transform.Traverse().Skip(1).ToList(); { var isCreated = false; if (humanoid != null) { description = humanoid.GetDescription(out isCreated); } if (description != null) { // use description VRM.humanoid.Apply(description, nodes); } if (isCreated) { GameObject.DestroyImmediate(description); } } { // set humanoid bone mapping var avatar = animator.avatar; foreach (HumanBodyBones key in Enum.GetValues(typeof(HumanBodyBones))) { if (key == HumanBodyBones.LastBone) { break; } var transform = animator.GetBoneTransform(key); if (transform != null) { VRM.humanoid.SetNodeIndex(key, nodes.IndexOf(transform)); } } } } // morph var master = Copy.GetComponent <VRMBlendShapeProxy>(); if (master != null) { var avatar = master.BlendShapeAvatar; if (avatar != null) { foreach (var x in avatar.Clips) { VRM.blendShapeMaster.Add(x, this); } } } // secondary VRMSpringUtility.ExportSecondary(Copy.transform, Nodes, x => VRM.secondaryAnimation.colliderGroups.Add(x), x => VRM.secondaryAnimation.boneGroups.Add(x) ); #pragma warning disable 0618 // meta(obsolete) { var meta = Copy.GetComponent <VRMMetaInformation>(); if (meta != null) { VRM.meta.author = meta.Author; VRM.meta.contactInformation = meta.ContactInformation; VRM.meta.title = meta.Title; if (meta.Thumbnail != null) { VRM.meta.texture = TextureExporter.ExportTexture(glTF, glTF.buffers.Count - 1, meta.Thumbnail, glTFTextureTypes.Unknown); } VRM.meta.licenseType = meta.LicenseType; VRM.meta.otherLicenseUrl = meta.OtherLicenseUrl; VRM.meta.reference = meta.Reference; } } #pragma warning restore 0618 // meta { var _meta = Copy.GetComponent <VRMMeta>(); if (_meta != null && _meta.Meta != null) { var meta = _meta.Meta; // info VRM.meta.version = meta.Version; VRM.meta.author = meta.Author; VRM.meta.contactInformation = meta.ContactInformation; VRM.meta.reference = meta.Reference; VRM.meta.title = meta.Title; if (meta.Thumbnail != null) { VRM.meta.texture = TextureExporter.ExportTexture(glTF, glTF.buffers.Count - 1, meta.Thumbnail, glTFTextureTypes.Unknown); } // ussage permission VRM.meta.allowedUser = meta.AllowedUser; VRM.meta.violentUssage = meta.ViolentUssage; VRM.meta.sexualUssage = meta.SexualUssage; VRM.meta.commercialUssage = meta.CommercialUssage; VRM.meta.otherPermissionUrl = meta.OtherPermissionUrl; // distribution license VRM.meta.licenseType = meta.LicenseType; if (meta.LicenseType == LicenseType.Other) { VRM.meta.otherLicenseUrl = meta.OtherLicenseUrl; } } } // firstPerson var firstPerson = Copy.GetComponent <VRMFirstPerson>(); if (firstPerson != null) { if (firstPerson.FirstPersonBone != null) { 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(); } // lookAt { var lookAtHead = Copy.GetComponent <VRMLookAtHead>(); if (lookAtHead != null) { var boneApplyer = Copy.GetComponent <VRMLookAtBoneApplyer>(); var blendShapeApplyer = Copy.GetComponent <VRMLookAtBlendShapeApplyer>(); if (boneApplyer != null) { VRM.firstPerson.lookAtType = LookAtType.Bone; VRM.firstPerson.lookAtHorizontalInner.Apply(boneApplyer.HorizontalInner); VRM.firstPerson.lookAtHorizontalOuter.Apply(boneApplyer.HorizontalOuter); VRM.firstPerson.lookAtVerticalDown.Apply(boneApplyer.VerticalDown); VRM.firstPerson.lookAtVerticalUp.Apply(boneApplyer.VerticalUp); } else if (blendShapeApplyer != null) { VRM.firstPerson.lookAtType = LookAtType.BlendShape; VRM.firstPerson.lookAtHorizontalOuter.Apply(blendShapeApplyer.Horizontal); VRM.firstPerson.lookAtVerticalDown.Apply(blendShapeApplyer.VerticalDown); VRM.firstPerson.lookAtVerticalUp.Apply(blendShapeApplyer.VerticalUp); } } } } // materials foreach (var m in Materials) { VRM.materialProperties.Add(VRMMaterialExporter.CreateFromMaterial(m, TextureManager.Textures)); } // Serialize VRM var f = new JsonFormatter(); VRMSerializer.Serialize(f, VRM); var bytes = f.GetStoreBytes(); glTFExtensionExport.GetOrCreate(ref glTF.extensions).Add("VRM", bytes); }
public static void _Export(glTF gltf, VRMExporter exporter, GameObject go) { exporter.Prepare(go); exporter.Export(); // avatar var animator = go.GetComponent <Animator>(); if (animator != null) { var humanoid = go.GetComponent <VRMHumanoidDescription>(); UniHumanoid.AvatarDescription description = null; var nodes = go.transform.Traverse().Skip(1).ToList(); { var isCreated = false; if (humanoid != null) { description = humanoid.GetDescription(out isCreated); } if (description != null) { // use description gltf.extensions.VRM.humanoid.Apply(description, nodes); } if (isCreated) { GameObject.DestroyImmediate(description); } } { // set humanoid bone mapping var avatar = animator.avatar; foreach (HumanBodyBones key in Enum.GetValues(typeof(HumanBodyBones))) { if (key == HumanBodyBones.LastBone) { break; } var transform = animator.GetBoneTransform(key); if (transform != null) { gltf.extensions.VRM.humanoid.SetNodeIndex(key, nodes.IndexOf(transform)); } } } } // morph var master = go.GetComponent <VRMBlendShapeProxy>(); if (master != null) { var avatar = master.BlendShapeAvatar; if (avatar != null) { var meshes = exporter.Meshes; foreach (var x in avatar.Clips) { gltf.extensions.VRM.blendShapeMaster.Add(x, exporter.Copy.transform, meshes); } } } // secondary VRMSpringUtility.ExportSecondary(exporter.Copy.transform, exporter.Nodes, x => gltf.extensions.VRM.secondaryAnimation.colliderGroups.Add(x), x => gltf.extensions.VRM.secondaryAnimation.boneGroups.Add(x) ); // meta(obsolete) { var meta = exporter.Copy.GetComponent <VRMMetaInformation>(); if (meta != null) { gltf.extensions.VRM.meta.author = meta.Author; gltf.extensions.VRM.meta.contactInformation = meta.ContactInformation; gltf.extensions.VRM.meta.title = meta.Title; if (meta.Thumbnail != null) { gltf.extensions.VRM.meta.texture = TextureIO.ExportTexture(gltf, gltf.buffers.Count - 1, meta.Thumbnail, false); } gltf.extensions.VRM.meta.licenseType = meta.LicenseType; gltf.extensions.VRM.meta.otherLicenseUrl = meta.OtherLicenseUrl; gltf.extensions.VRM.meta.reference = meta.Reference; } } // meta { var _meta = exporter.Copy.GetComponent <VRMMeta>(); if (_meta != null && _meta.Meta != null) { var meta = _meta.Meta; // info gltf.extensions.VRM.meta.version = meta.Version; gltf.extensions.VRM.meta.author = meta.Author; gltf.extensions.VRM.meta.contactInformation = meta.ContactInformation; gltf.extensions.VRM.meta.reference = meta.Reference; gltf.extensions.VRM.meta.title = meta.Title; if (meta.Thumbnail != null) { gltf.extensions.VRM.meta.texture = TextureIO.ExportTexture(gltf, gltf.buffers.Count - 1, meta.Thumbnail, false); } // ussage pemission gltf.extensions.VRM.meta.allowedUser = meta.AllowedUser; gltf.extensions.VRM.meta.violentUssage = meta.ViolentUssage; gltf.extensions.VRM.meta.sexualUssage = meta.SexualUssage; gltf.extensions.VRM.meta.commercialUssage = meta.CommercialUssage; gltf.extensions.VRM.meta.otherPermissionUrl = meta.OtherPermissionUrl; // distribution license gltf.extensions.VRM.meta.licenseType = meta.LicenseType; if (meta.LicenseType == LicenseType.Other) { gltf.extensions.VRM.meta.otherLicenseUrl = meta.OtherLicenseUrl; } } } // firstPerson var firstPerson = exporter.Copy.GetComponent <VRMFirstPerson>(); if (firstPerson != null) { if (firstPerson.FirstPersonBone != null) { gltf.extensions.VRM.firstPerson.firstPersonBone = exporter.Nodes.IndexOf(firstPerson.FirstPersonBone); gltf.extensions.VRM.firstPerson.firstPersonBoneOffset = firstPerson.FirstPersonOffset; gltf.extensions.VRM.firstPerson.meshAnnotations = firstPerson.Renderers.Select(x => new glTF_VRM_MeshAnnotation { mesh = exporter.Meshes.IndexOf(x.SharedMesh), firstPersonFlag = x.FirstPersonFlag.ToString(), }).ToList(); } // lookAt { var lookAtHead = exporter.Copy.GetComponent <VRMLookAtHead>(); var lookAt = exporter.Copy.GetComponent <VRMLookAt>(); if (lookAtHead != null) { var boneApplyer = exporter.Copy.GetComponent <VRMLookAtBoneApplyer>(); var blendShapeApplyer = exporter.Copy.GetComponent <VRMLookAtBlendShapeApplyer>(); if (boneApplyer != null) { gltf.extensions.VRM.firstPerson.lookAtType = LookAtType.Bone; gltf.extensions.VRM.firstPerson.lookAtHorizontalInner.Apply(boneApplyer.HorizontalInner); gltf.extensions.VRM.firstPerson.lookAtHorizontalOuter.Apply(boneApplyer.HorizontalOuter); gltf.extensions.VRM.firstPerson.lookAtVerticalDown.Apply(boneApplyer.VerticalDown); gltf.extensions.VRM.firstPerson.lookAtVerticalUp.Apply(boneApplyer.VerticalUp); } else if (blendShapeApplyer != null) { gltf.extensions.VRM.firstPerson.lookAtType = LookAtType.BlendShape; gltf.extensions.VRM.firstPerson.lookAtHorizontalOuter.Apply(blendShapeApplyer.Horizontal); gltf.extensions.VRM.firstPerson.lookAtVerticalDown.Apply(blendShapeApplyer.VerticalDown); gltf.extensions.VRM.firstPerson.lookAtVerticalUp.Apply(blendShapeApplyer.VerticalUp); } } else if (lookAt != null) { gltf.extensions.VRM.firstPerson.lookAtHorizontalInner.Apply(lookAt.HorizontalInner); gltf.extensions.VRM.firstPerson.lookAtHorizontalOuter.Apply(lookAt.HorizontalOuter); gltf.extensions.VRM.firstPerson.lookAtVerticalDown.Apply(lookAt.VerticalDown); gltf.extensions.VRM.firstPerson.lookAtVerticalUp.Apply(lookAt.VerticalUp); } } } // materials foreach (var m in exporter.Materials) { gltf.extensions.VRM.materialProperties.Add(glTF_VRM_Material.CreateFromMaterial(m, exporter.Textures)); } }
public static void _Export(glTF_VRM gltf, VRMExporter exporter, GameObject go) { exporter.Prepare(go); exporter.Export(); // avatar var animator = go.GetComponent <Animator>(); if (animator != null) { var humanoid = go.GetComponent <VRMHumanoidDescription>(); UniHumanoid.AvatarDescription description = null; var nodes = go.transform.Traverse().Skip(1).ToList(); { var isCreated = false; if (humanoid != null) { description = humanoid.GetDescription(out isCreated); } if (description != null) { // use description gltf.extensions.VRM.humanoid.Apply(description, nodes); } if (isCreated) { GameObject.DestroyImmediate(description); } } { // set humanoid bone mapping var avatar = animator.avatar; foreach (HumanBodyBones key in Enum.GetValues(typeof(HumanBodyBones))) { if (key == HumanBodyBones.LastBone) { break; } var transform = animator.GetBoneTransform(key); if (transform != null) { gltf.extensions.VRM.humanoid.SetNodeIndex(key, nodes.IndexOf(transform)); } } } } // morph var master = go.GetComponent <VRMBlendShapeProxy>(); if (master != null) { var avatar = master.BlendShapeAvatar; if (avatar != null) { var meshes = exporter.Meshes; foreach (var x in avatar.Clips) { gltf.extensions.VRM.blendShapeMaster.Add(x, exporter.Copy.transform, meshes); } } } // secondary var secondary = exporter.Copy.transform.Find("secondary"); if (secondary == null) { secondary = exporter.Copy.transform; } var colliders = new List <VRMSpringBoneColliderGroup>(); foreach (var vrmColliderGroup in exporter.Copy.transform.Traverse().Select(x => x.GetComponent <VRMSpringBoneColliderGroup>()).Where(x => x != null)) { colliders.Add(vrmColliderGroup); var colliderGroup = new glTF_VRM_SecondaryAnimationColliderGroup { node = exporter.Nodes.IndexOf(vrmColliderGroup.transform) }; colliderGroup.colliders = vrmColliderGroup.Colliders.Select(x => { return(new glTF_VRM_SecondaryAnimationCollider { offset = x.Offset, radius = x.Radius, }); }).ToList(); gltf.extensions.VRM.secondaryAnimation.colliderGroups.Add(colliderGroup); } foreach (var spring in secondary.GetComponents <VRMSpringBone>()) { gltf.extensions.VRM.secondaryAnimation.boneGroups.Add(new glTF_VRM_SecondaryAnimationGroup { comment = spring.m_comment, center = exporter.Nodes.IndexOf(spring.m_center), dragForce = spring.m_dragForce, gravityDir = spring.m_gravityDir, gravityPower = spring.m_gravityPower, stiffiness = spring.m_stiffnessForce, hitRadius = spring.m_hitRadius, colliderGroups = spring.ColliderGroups .Select(x => { var index = colliders.IndexOf(x); if (index == -1) { throw new IndexOutOfRangeException(); } return(index); }) .ToArray(), bones = spring.RootBones.Select(x => exporter.Nodes.IndexOf(x)).ToArray(), }); } // meta(obsolete) { var meta = exporter.Copy.GetComponent <VRMMetaInformation>(); if (meta != null) { gltf.extensions.VRM.meta.author = meta.Author; gltf.extensions.VRM.meta.contactInformation = meta.ContactInformation; gltf.extensions.VRM.meta.title = meta.Title; if (meta.Thumbnail != null) { gltf.extensions.VRM.meta.texture = gltfExporter.ExportTexture(gltf, gltf.buffers.Count - 1, meta.Thumbnail); } gltf.extensions.VRM.meta.licenseType = meta.LicenseType; gltf.extensions.VRM.meta.otherLicenseUrl = meta.OtherLicenseUrl; gltf.extensions.VRM.meta.reference = meta.Reference; } } // meta { var _meta = exporter.Copy.GetComponent <VRMMeta>(); if (_meta != null && _meta.Meta != null) { var meta = _meta.Meta; // info gltf.extensions.VRM.meta.version = meta.Version; gltf.extensions.VRM.meta.author = meta.Author; gltf.extensions.VRM.meta.contactInformation = meta.ContactInformation; gltf.extensions.VRM.meta.reference = meta.Reference; gltf.extensions.VRM.meta.title = meta.Title; if (meta.Thumbnail != null) { gltf.extensions.VRM.meta.texture = gltfExporter.ExportTexture(gltf, gltf.buffers.Count - 1, meta.Thumbnail); } // ussage pemission gltf.extensions.VRM.meta.allowedUser = meta.AllowedUser; gltf.extensions.VRM.meta.violentUssage = meta.ViolentUssage; gltf.extensions.VRM.meta.sexualUssage = meta.SexualUssage; gltf.extensions.VRM.meta.commercialUssage = meta.CommercialUssage; gltf.extensions.VRM.meta.otherPermissionUrl = meta.OtherPermissionUrl; // distribution license gltf.extensions.VRM.meta.licenseType = meta.LicenseType; if (meta.LicenseType == LicenseType.Other) { gltf.extensions.VRM.meta.otherLicenseUrl = meta.OtherLicenseUrl; } } } // firstPerson var firstPerson = exporter.Copy.GetComponent <VRMFirstPerson>(); if (firstPerson != null) { if (firstPerson.FirstPersonBone != null) { gltf.extensions.VRM.firstPerson.firstPersonBone = exporter.Nodes.IndexOf(firstPerson.FirstPersonBone); gltf.extensions.VRM.firstPerson.firstPersonBoneOffset = firstPerson.FirstPersonOffset; gltf.extensions.VRM.firstPerson.meshAnnotations = firstPerson.Renderers.Select(x => new glTF_VRM_MeshAnnotation { mesh = exporter.Meshes.IndexOf(x.SharedMesh), firstPersonFlag = x.FirstPersonFlag.ToString(), }).ToList(); } // lookAt { var lookAtHead = exporter.Copy.GetComponent <VRMLookAtHead>(); var lookAt = exporter.Copy.GetComponent <VRMLookAt>(); if (lookAtHead != null) { var boneApplyer = exporter.Copy.GetComponent <VRMLookAtBoneApplyer>(); var blendShapeApplyer = exporter.Copy.GetComponent <VRMLookAtBlendShapeApplyer>(); if (boneApplyer != null) { gltf.extensions.VRM.firstPerson.lookAtType = LookAtType.Bone; gltf.extensions.VRM.firstPerson.lookAtHorizontalInner.Apply(boneApplyer.HorizontalInner); gltf.extensions.VRM.firstPerson.lookAtHorizontalOuter.Apply(boneApplyer.HorizontalOuter); gltf.extensions.VRM.firstPerson.lookAtVerticalDown.Apply(boneApplyer.VerticalDown); gltf.extensions.VRM.firstPerson.lookAtVerticalUp.Apply(boneApplyer.VerticalUp); } else if (blendShapeApplyer != null) { gltf.extensions.VRM.firstPerson.lookAtType = LookAtType.BlendShape; gltf.extensions.VRM.firstPerson.lookAtHorizontalOuter.Apply(blendShapeApplyer.Horizontal); gltf.extensions.VRM.firstPerson.lookAtVerticalDown.Apply(blendShapeApplyer.VerticalDown); gltf.extensions.VRM.firstPerson.lookAtVerticalUp.Apply(blendShapeApplyer.VerticalUp); } } else if (lookAt != null) { gltf.extensions.VRM.firstPerson.lookAtHorizontalInner.Apply(lookAt.HorizontalInner); gltf.extensions.VRM.firstPerson.lookAtHorizontalOuter.Apply(lookAt.HorizontalOuter); gltf.extensions.VRM.firstPerson.lookAtVerticalDown.Apply(lookAt.VerticalDown); gltf.extensions.VRM.firstPerson.lookAtVerticalUp.Apply(lookAt.VerticalUp); } } } // materials foreach (var m in exporter.Materials) { gltf.extensions.VRM.materialProperties.Add(glTF_VRM_Material.CreateFromMaterial(m, exporter.Textures)); } }