From 7a9714fff51a3be4db5a7c246380d549b167db30 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 21 Jan 2021 14:29:04 +0900 Subject: [PATCH] MigrateMeta --- Assets/VRM10/Editor/MigrationMenu.cs | 5 +- Assets/VRM10/Runtime/Migration/Migration.cs | 103 +++++++++ .../Runtime/UnityBuilder/ComponentBuilder.cs | 200 +++++++++--------- 3 files changed, 208 insertions(+), 100 deletions(-) diff --git a/Assets/VRM10/Editor/MigrationMenu.cs b/Assets/VRM10/Editor/MigrationMenu.cs index d18c0ef3e..c6f47a4e3 100644 --- a/Assets/VRM10/Editor/MigrationMenu.cs +++ b/Assets/VRM10/Editor/MigrationMenu.cs @@ -29,14 +29,15 @@ namespace UniVRM10 var dst = EditorUtility.SaveFilePanel( "Save vrm1 file", s_lastPath, - $"{path.FileName}_vrm1", + $"{path.FileNameWithoutExtension}_vrm1", "vrm"); if (string.IsNullOrEmpty(dst)) { return; } - s_lastPath = Path.GetDirectoryName(dst); + + // write result File.WriteAllBytes(dst, vrm1Bytes); // immediately import for GUI update diff --git a/Assets/VRM10/Runtime/Migration/Migration.cs b/Assets/VRM10/Runtime/Migration/Migration.cs index fca7cc5a6..0b050fda5 100644 --- a/Assets/VRM10/Runtime/Migration/Migration.cs +++ b/Assets/VRM10/Runtime/Migration/Migration.cs @@ -127,6 +127,105 @@ namespace UniVRM10 return humanoid; } + /// + /// 互換性の無いところ + /// + /// * きつくなる方向は許す + /// * 緩くなる方向は不許可(throw) + /// + // "meta": { + // "title": "Alicia Solid", + // "version": "1.10", + // "author": "© DWANGO Co., Ltd.", + // "contactInformation": "https://3d.nicovideo.jp/alicia/", + // "reference": "", + // "texture": 7, + // "allowedUserName": "Everyone", + // "violentUssageName": "Disallow", + // "sexualUssageName": "Disallow", + // "commercialUssageName": "Allow", + // "otherPermissionUrl": "https://3d.nicovideo.jp/alicia/rule.html", + // "licenseName": "Other", + // "otherLicenseUrl": "https://3d.nicovideo.jp/alicia/rule.html" + // }, + static UniGLTF.Extensions.VRMC_vrm.Meta MigrateMeta(ListTreeNode vrm0) + { + var meta = new UniGLTF.Extensions.VRMC_vrm.Meta + { + AllowPoliticalOrReligiousUsage = false, + AllowExcessivelySexualUsage = false, + AllowExcessivelyViolentUsage = false, + AllowRedistribution = false, + AvatarPermission = AvatarPermissionType.onlyAuthor, + CommercialUsage = CommercialUsageType.personalNonProfit, + CreditNotation = CreditNotationType.required, + Modification = ModificationType.prohibited, + }; + + foreach (var kv in vrm0.ObjectItems()) + { + var key = kv.Key.GetString(); + switch (key) + { + case "title": meta.Name = kv.Value.GetString(); break; + case "version": meta.Version = kv.Value.GetString(); break; + case "author": meta.Authors = new List() { kv.Value.GetString() }; break; + case "contactInformation": meta.ContactInformation = kv.Value.GetString(); break; + case "reference": meta.References = new List() { kv.Value.GetString() }; break; + case "texture": meta.ThumbnailImage = kv.Value.GetInt32(); break; + + case "allowedUserName": + { + var allowdUserType = kv.Value.GetString(); + switch (allowdUserType) + { + case "Everyone": meta.AvatarPermission = AvatarPermissionType.everyone; break; + default: throw new NotImplementedException($"allowedUser: {allowdUserType}"); + } + } + break; + + case "violentUssageName": meta.AllowExcessivelyViolentUsage = kv.Value.GetString().ToLower() == "allow"; break; + case "sexualUssageName": meta.AllowExcessivelySexualUsage = kv.Value.GetString().ToLower() == "allow"; break; + case "commercialUssageName": + { + var commercialUssageType = kv.Value.GetString(); + switch (commercialUssageType) + { + case "Allow": meta.CommercialUsage = CommercialUsageType.personalProfit; break; + default: meta.CommercialUsage = CommercialUsageType.personalNonProfit; break; + } + } + break; + + case "otherPermissionUrl": + { + // TODO + // var url = kv.Value.GetString(); + // if (!String.IsNullOrWhiteSpace(url)) + // { + // throw new NotImplementedException("otherPermissionUrl not allowd"); + // } + } + break; + + case "otherLicenseUrl": meta.OtherLicenseUrl = kv.Value.GetString(); break; + + case "licenseName": + { + // TODO + // CreditNotation = CreditNotationType.required, + } + break; + + default: + throw new NotImplementedException(key); + } + } + + return meta; + } + public static byte[] Migrate(byte[] src) { var glb = UniGLTF.Glb.Parse(src); @@ -145,6 +244,10 @@ namespace UniVRM10 { var vrm1 = new VRMC_vrm(); var vrm0 = json["extensions"]["VRM"]; + + // meta + vrm1.Meta = MigrateMeta(vrm0["meta"]); + // humanoid vrm1.Humanoid = MigrateHumanoid(vrm0["humanoid"]); var f = new JsonFormatter(); diff --git a/Assets/VRM10/Runtime/UnityBuilder/ComponentBuilder.cs b/Assets/VRM10/Runtime/UnityBuilder/ComponentBuilder.cs index eef579634..33ca9cb1b 100644 --- a/Assets/VRM10/Runtime/UnityBuilder/ComponentBuilder.cs +++ b/Assets/VRM10/Runtime/UnityBuilder/ComponentBuilder.cs @@ -184,127 +184,131 @@ namespace UniVRM10 // firstPerson { // VRMFirstPerson - controller.FirstPerson.Renderers = model.Vrm.FirstPerson.Annotations.Select(x => - new UniVRM10.RendererFirstPersonFlags() - { - Renderer = asset.Map.Renderers[x.Node], - FirstPersonFlag = x.FirstPersonFlag - } - ).ToList(); + if (model.Vrm.FirstPerson != null) + { + controller.FirstPerson.Renderers = model.Vrm.FirstPerson.Annotations.Select(x => + new UniVRM10.RendererFirstPersonFlags() + { + Renderer = asset.Map.Renderers[x.Node], + FirstPersonFlag = x.FirstPersonFlag + } + ).ToList(); + } // VRMLookAtApplyer - controller.LookAt.OffsetFromHead = model.Vrm.LookAt.OffsetFromHeadBone.ToUnityVector3(); - if (model.Vrm.LookAt.LookAtType == VrmLib.LookAtType.Expression) + if (model.Vrm.LookAt != null) { - var lookAtApplyer = controller; - lookAtApplyer.LookAt.LookAtType = VRM10ControllerLookAt.LookAtTypes.Expression; - lookAtApplyer.LookAt.HorizontalOuter = new UniVRM10.CurveMapper( - model.Vrm.LookAt.HorizontalOuter.InputMaxValue, - model.Vrm.LookAt.HorizontalOuter.OutputScaling); - lookAtApplyer.LookAt.VerticalUp = new UniVRM10.CurveMapper( - model.Vrm.LookAt.VerticalUp.InputMaxValue, - model.Vrm.LookAt.VerticalUp.OutputScaling); - lookAtApplyer.LookAt.VerticalDown = new UniVRM10.CurveMapper( - model.Vrm.LookAt.VerticalDown.InputMaxValue, - model.Vrm.LookAt.VerticalDown.OutputScaling); - } - else if (model.Vrm.LookAt.LookAtType == VrmLib.LookAtType.Bone) - { - var lookAtBoneApplyer = controller; - lookAtBoneApplyer.LookAt.HorizontalInner = new UniVRM10.CurveMapper( - model.Vrm.LookAt.HorizontalInner.InputMaxValue, - model.Vrm.LookAt.HorizontalInner.OutputScaling); - lookAtBoneApplyer.LookAt.HorizontalOuter = new UniVRM10.CurveMapper( - model.Vrm.LookAt.HorizontalOuter.InputMaxValue, - model.Vrm.LookAt.HorizontalOuter.OutputScaling); - lookAtBoneApplyer.LookAt.VerticalUp = new UniVRM10.CurveMapper( - model.Vrm.LookAt.VerticalUp.InputMaxValue, - model.Vrm.LookAt.VerticalUp.OutputScaling); - lookAtBoneApplyer.LookAt.VerticalDown = new UniVRM10.CurveMapper( - model.Vrm.LookAt.VerticalDown.InputMaxValue, - model.Vrm.LookAt.VerticalDown.OutputScaling); - } - else - { - throw new NotImplementedException(); + controller.LookAt.OffsetFromHead = model.Vrm.LookAt.OffsetFromHeadBone.ToUnityVector3(); + if (model.Vrm.LookAt.LookAtType == VrmLib.LookAtType.Expression) + { + var lookAtApplyer = controller; + lookAtApplyer.LookAt.LookAtType = VRM10ControllerLookAt.LookAtTypes.Expression; + lookAtApplyer.LookAt.HorizontalOuter = new UniVRM10.CurveMapper( + model.Vrm.LookAt.HorizontalOuter.InputMaxValue, + model.Vrm.LookAt.HorizontalOuter.OutputScaling); + lookAtApplyer.LookAt.VerticalUp = new UniVRM10.CurveMapper( + model.Vrm.LookAt.VerticalUp.InputMaxValue, + model.Vrm.LookAt.VerticalUp.OutputScaling); + lookAtApplyer.LookAt.VerticalDown = new UniVRM10.CurveMapper( + model.Vrm.LookAt.VerticalDown.InputMaxValue, + model.Vrm.LookAt.VerticalDown.OutputScaling); + } + else if (model.Vrm.LookAt.LookAtType == VrmLib.LookAtType.Bone) + { + var lookAtBoneApplyer = controller; + lookAtBoneApplyer.LookAt.HorizontalInner = new UniVRM10.CurveMapper( + model.Vrm.LookAt.HorizontalInner.InputMaxValue, + model.Vrm.LookAt.HorizontalInner.OutputScaling); + lookAtBoneApplyer.LookAt.HorizontalOuter = new UniVRM10.CurveMapper( + model.Vrm.LookAt.HorizontalOuter.InputMaxValue, + model.Vrm.LookAt.HorizontalOuter.OutputScaling); + lookAtBoneApplyer.LookAt.VerticalUp = new UniVRM10.CurveMapper( + model.Vrm.LookAt.VerticalUp.InputMaxValue, + model.Vrm.LookAt.VerticalUp.OutputScaling); + lookAtBoneApplyer.LookAt.VerticalDown = new UniVRM10.CurveMapper( + model.Vrm.LookAt.VerticalDown.InputMaxValue, + model.Vrm.LookAt.VerticalDown.OutputScaling); + } + else + { + throw new NotImplementedException(); + } } } // springBone + if (model.Vrm.SpringBone != null) { - if (model.Vrm.SpringBone != null) + foreach (var vrmSpring in model.Vrm.SpringBone.Springs) { - foreach (var vrmSpring in model.Vrm.SpringBone.Springs) + // create a spring + var springBone = new UniVRM10.VRM10SpringBone(); + springBone.m_comment = vrmSpring.Comment; + if (vrmSpring.Origin != null && asset.Map.Nodes.TryGetValue(vrmSpring.Origin, out GameObject origin)) { - // create a spring - var springBone = new UniVRM10.VRM10SpringBone(); - springBone.m_comment = vrmSpring.Comment; - if (vrmSpring.Origin != null && asset.Map.Nodes.TryGetValue(vrmSpring.Origin, out GameObject origin)) + springBone.m_center = origin.transform; + } + controller.SpringBone.Springs.Add(springBone); + + // create colliders for the spring + foreach (var vrmSpringBoneCollider in vrmSpring.Colliders) + { + var go = asset.Map.Nodes[vrmSpringBoneCollider.Node]; + var springBoneColliderGroup = go.GetComponent(); + if (springBoneColliderGroup != null) { - springBone.m_center = origin.transform; + // already setup } - controller.SpringBone.Springs.Add(springBone); - - // create colliders for the spring - foreach (var vrmSpringBoneCollider in vrmSpring.Colliders) + else { - var go = asset.Map.Nodes[vrmSpringBoneCollider.Node]; - var springBoneColliderGroup = go.GetComponent(); - if (springBoneColliderGroup != null) - { - // already setup - } - else - { - // new collider - springBoneColliderGroup = go.AddComponent(); + // new collider + springBoneColliderGroup = go.AddComponent(); - // add collider shapes - springBoneColliderGroup.Colliders.Clear(); - foreach (var x in vrmSpringBoneCollider.Colliders) + // add collider shapes + springBoneColliderGroup.Colliders.Clear(); + foreach (var x in vrmSpringBoneCollider.Colliders) + { + switch (x.ColliderType) { - switch (x.ColliderType) - { - case VrmLib.VrmSpringBoneColliderTypes.Sphere: - springBoneColliderGroup.Colliders.Add(new UniVRM10.VRM10SpringBoneCollider() - { - ColliderType = VRM10SpringBoneColliderTypes.Sphere, - Offset = x.Offset.ToUnityVector3(), - Radius = x.Radius - }); - break; + case VrmLib.VrmSpringBoneColliderTypes.Sphere: + springBoneColliderGroup.Colliders.Add(new UniVRM10.VRM10SpringBoneCollider() + { + ColliderType = VRM10SpringBoneColliderTypes.Sphere, + Offset = x.Offset.ToUnityVector3(), + Radius = x.Radius + }); + break; - case VrmLib.VrmSpringBoneColliderTypes.Capsule: - springBoneColliderGroup.Colliders.Add(new UniVRM10.VRM10SpringBoneCollider() - { - ColliderType = VRM10SpringBoneColliderTypes.Capsule, - Offset = x.Offset.ToUnityVector3(), - Radius = x.Radius, - Tail = x.CapsuleTail.ToUnityVector3(), - }); - break; + case VrmLib.VrmSpringBoneColliderTypes.Capsule: + springBoneColliderGroup.Colliders.Add(new UniVRM10.VRM10SpringBoneCollider() + { + ColliderType = VRM10SpringBoneColliderTypes.Capsule, + Offset = x.Offset.ToUnityVector3(), + Radius = x.Radius, + Tail = x.CapsuleTail.ToUnityVector3(), + }); + break; - default: - throw new NotImplementedException(); - } + default: + throw new NotImplementedException(); } } - springBone.ColliderGroups.Add(springBoneColliderGroup); } + springBone.ColliderGroups.Add(springBoneColliderGroup); + } - // create joint for the spring - foreach (var vrmJoint in vrmSpring.Joints) - { - var joint = new VRM10SpringBone.VRM10SpringJoint(); + // create joint for the spring + foreach (var vrmJoint in vrmSpring.Joints) + { + var joint = new VRM10SpringBone.VRM10SpringJoint(); - joint.m_stiffnessForce = vrmJoint.Stiffness; - joint.m_gravityPower = vrmJoint.GravityPower; - joint.m_gravityDir = vrmJoint.GravityDir.ToUnityVector3(); - joint.m_dragForce = vrmJoint.DragForce; - joint.m_hitRadius = vrmJoint.HitRadius; + joint.m_stiffnessForce = vrmJoint.Stiffness; + joint.m_gravityPower = vrmJoint.GravityPower; + joint.m_gravityDir = vrmJoint.GravityDir.ToUnityVector3(); + joint.m_dragForce = vrmJoint.DragForce; + joint.m_hitRadius = vrmJoint.HitRadius; - springBone.Joints.Add(joint); - } + springBone.Joints.Add(joint); } } }