using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using UniGLTF; using UniGLTF.SpringBoneJobs.Blittables; using UnityEngine; using UnityEngine.UI; namespace UniVRM10.VRM10Viewer { public class VRM10ViewerUI : MonoBehaviour { [SerializeField] GameObject Root = default; [SerializeField] Text m_version = default; [SerializeField] Transform m_faceCamera = default; [Header("UI")] [SerializeField] Button m_openModel = default; [SerializeField] Button m_openMotion = default; [SerializeField] Button m_pastePose = default; [SerializeField] Toggle m_showBoxMan = default; [SerializeField] Toggle m_useAsync = default; [SerializeField] TextAsset m_motion; [SerializeField, Header("springbone")] Toggle m_useSpringboneSingelton = default; [SerializeField] Toggle m_springbonePause = default; [SerializeField] Toggle m_springboneScaling = default; [SerializeField] Slider m_springboneExternalX = default; [SerializeField] Slider m_springboneExternalY = default; [SerializeField] Slider m_springboneExternalZ = default; [SerializeField] Button m_resetSpringBone = default; [SerializeField] Button m_reconstructSpringBone = default; [SerializeField, Header("expression")] Toggle m_enableAutoExpression = default; [Serializable] class EmotionFields { public Slider m_expression; public Toggle m_binary; public bool m_useOverride; public Dropdown m_overrideMouth; public Dropdown m_overrideBlink; public Dropdown m_overrideLookAt; public void Reset(ObjectMap map, string name, bool useOveride) { m_expression = map.Get($"Slider{name}"); m_binary = map.Get($"Binary{name}"); m_useOverride = useOveride; if (useOveride) { m_overrideMouth = map.Get($"Override{name}Mouth"); m_overrideBlink = map.Get($"Override{name}Blink"); m_overrideLookAt = map.Get($"Override{name}LookAt"); } } static int GetOverrideIndex(UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType value) { switch (value) { case UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.none: return 0; case UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.block: return 1; case UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.blend: return 2; default: return -1; } } static UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType ToOverrideType(int index) { switch (index) { case 0: return UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.none; case 1: return UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.block; case 2: return UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.blend; default: throw new ArgumentException(); } } public void OnLoad(VRM10Expression expression) { m_binary.isOn = expression.IsBinary; if (m_useOverride) { m_overrideMouth.SetValueWithoutNotify(GetOverrideIndex(expression.OverrideMouth)); m_overrideBlink.SetValueWithoutNotify(GetOverrideIndex(expression.OverrideBlink)); m_overrideLookAt.SetValueWithoutNotify(GetOverrideIndex(expression.OverrideLookAt)); } } public void ApplyRuntime(VRM10Expression expression) { expression.IsBinary = m_binary.isOn; if (m_useOverride) { expression.OverrideMouth = ToOverrideType(m_overrideMouth.value); expression.OverrideBlink = ToOverrideType(m_overrideBlink.value); expression.OverrideLookAt = ToOverrideType(m_overrideLookAt.value); } } } [SerializeField] EmotionFields m_happy; [SerializeField] EmotionFields m_angry; [SerializeField] EmotionFields m_sad; [SerializeField] EmotionFields m_relaxed; [SerializeField] EmotionFields m_surprised; [SerializeField] Toggle m_enableLipSync = default; [SerializeField] EmotionFields m_lipAa = default; [SerializeField] EmotionFields m_lipIh = default; [SerializeField] EmotionFields m_lipOu = default; [SerializeField] EmotionFields m_lipEe = default; [SerializeField] EmotionFields m_lipOh = default; [SerializeField] Toggle m_enableAutoBlink = default; [SerializeField] EmotionFields m_blink = default; [SerializeField] GameObject m_lookAtTarget = default; [SerializeField] Toggle m_useLookAtTarget = default; [SerializeField] Slider m_yaw = default; [SerializeField] Slider m_pitch = default; IVrm10Animation m_src = default; public IVrm10Animation Motion { get { return m_src; } set { if (m_src != null) { m_src.Dispose(); } m_src = value; TPose = new Vrm10TPose(m_src.ControlRig.Item1.GetRawHipsPosition()); } } public IVrm10Animation TPose; private CancellationTokenSource _cancellationTokenSource; [Serializable] class TextFields { [SerializeField] Text m_textModelTitle = default; [SerializeField] Text m_textModelVersion = default; [SerializeField] Text m_textModelAuthor = default; [SerializeField] Text m_textModelCopyright = default; [SerializeField] Text m_textModelContact = default; [SerializeField] Text m_textModelReference = default; [SerializeField] RawImage m_thumbnail = default; [SerializeField, Header("CharacterPermission")] Text m_textPermissionAllowed = default; [SerializeField] Text m_textPermissionViolent = default; [SerializeField] Text m_textPermissionSexual = default; [SerializeField] Text m_textPermissionCommercial = default; [SerializeField] Text m_textPermissionOther = default; [SerializeField, Header("DistributionLicense")] Text m_textDistributionLicense = default; [SerializeField] Text m_textDistributionOther = default; public void Reset(ObjectMap map) { m_textModelTitle = map.Get("Title (1)"); m_textModelVersion = map.Get("Version (1)"); m_textModelAuthor = map.Get("Author (1)"); m_textModelCopyright = map.Get("Copyright (1)"); m_textModelContact = map.Get("Contact (1)"); m_textModelReference = map.Get("Reference (1)"); m_textPermissionAllowed = map.Get("AllowedUser (1)"); m_textPermissionViolent = map.Get("Violent (1)"); m_textPermissionSexual = map.Get("Sexual (1)"); m_textPermissionCommercial = map.Get("Commercial (1)"); m_textPermissionOther = map.Get("Other (1)"); m_textDistributionLicense = map.Get("LicenseType (1)"); m_textDistributionOther = map.Get("OtherLicense (1)"); #if UNITY_2022_3_OR_NEWER var images = GameObject.FindObjectsByType(FindObjectsSortMode.InstanceID); #else var images = GameObject.FindObjectsOfType(); #endif m_thumbnail = images.First(x => x.name == "RawImage"); } public void Start() { m_textModelTitle.text = ""; m_textModelVersion.text = ""; m_textModelAuthor.text = ""; m_textModelCopyright.text = ""; m_textModelContact.text = ""; m_textModelReference.text = ""; m_textPermissionAllowed.text = ""; m_textPermissionViolent.text = ""; m_textPermissionSexual.text = ""; m_textPermissionCommercial.text = ""; m_textPermissionOther.text = ""; m_textDistributionLicense.text = ""; m_textDistributionOther.text = ""; } public void UpdateMeta(Texture2D thumbnail, UniGLTF.Extensions.VRMC_vrm.Meta meta, Migration.Vrm0Meta meta0) { m_thumbnail.texture = thumbnail; if (meta != null) { m_textModelTitle.text = meta.Name; m_textModelVersion.text = meta.Version; m_textModelAuthor.text = meta.Authors[0]; m_textModelCopyright.text = meta.CopyrightInformation; m_textModelContact.text = meta.ContactInformation; if (meta.References != null && meta.References.Count > 0) { m_textModelReference.text = meta.References[0]; } m_textPermissionAllowed.text = meta.AvatarPermission.ToString(); m_textPermissionViolent.text = meta.AllowExcessivelyViolentUsage.ToString(); m_textPermissionSexual.text = meta.AllowExcessivelySexualUsage.ToString(); m_textPermissionCommercial.text = meta.CommercialUsage.ToString(); // m_textPermissionOther.text = meta.OtherPermissionUrl; // m_textDistributionLicense.text = meta.ModificationLicense.ToString(); m_textDistributionOther.text = meta.OtherLicenseUrl; } if (meta0 != null) { m_textModelTitle.text = meta0.title; m_textModelVersion.text = meta0.version; m_textModelAuthor.text = meta0.author; m_textModelContact.text = meta0.contactInformation; m_textModelReference.text = meta0.reference; m_textPermissionAllowed.text = meta0.allowedUser.ToString(); m_textPermissionViolent.text = meta0.violentUsage.ToString(); m_textPermissionSexual.text = meta0.sexualUsage.ToString(); m_textPermissionCommercial.text = meta0.commercialUsage.ToString(); m_textPermissionOther.text = meta0.otherPermissionUrl; // m_textDistributionLicense.text = meta0.ModificationLicense.ToString(); m_textDistributionOther.text = meta0.otherLicenseUrl; } } } [SerializeField] TextFields m_texts = default; [Serializable] class UIFields { [SerializeField] Toggle ToggleMotionTPose = default; [SerializeField] Toggle ToggleMotionBVH = default; [SerializeField] ToggleGroup ToggleMotion = default; public void Reset(ObjectMap map) { ToggleMotionTPose = map.Get("TPose"); ToggleMotionBVH = map.Get("BVH"); ToggleMotion = map.Get("_Motion_"); } public bool IsTPose { get => ToggleMotion.ActiveToggles().FirstOrDefault() == ToggleMotionTPose; set { ToggleMotionTPose.isOn = value; ToggleMotionBVH.isOn = !value; } } } [SerializeField] UIFields m_ui = default; class ObjectMap { Dictionary _map = new(); public IReadOnlyDictionary Objects => _map; public ObjectMap(GameObject root) { foreach (var x in root.GetComponentsInChildren()) { _map[x.name] = x.gameObject; } } public T Get(string name) where T : Component { return _map[name].GetComponent(); } } private void Reset() { var map = new ObjectMap(gameObject); Root = map.Objects["Root"]; m_openModel = map.Get