public void CopyTo(VRM10MetaObject dst) { dst.ExporterVersion = ExporterVersion; dst.Name = Name; dst.Version = Version; dst.CopyrightInformation = CopyrightInformation; if (Authors != null) { dst.Authors = Authors.Select(x => x).ToList(); } else { dst.Authors = new List <string>(); } dst.ContactInformation = ContactInformation; dst.References = References; dst.Thumbnail = Thumbnail; dst.AllowedUser = AllowedUser; dst.ViolentUsage = ViolentUsage; dst.SexualUsage = SexualUsage; dst.CommercialUsage = CommercialUsage; dst.GameUsage = GameUsage; dst.PoliticalOrReligiousUsage = PoliticalOrReligiousUsage; dst.OtherPermissionUrl = OtherPermissionUrl; dst.CreditNotation = CreditNotation; dst.Redistribution = Redistribution; dst.ModificationLicense = ModificationLicense; dst.OtherLicenseUrl = OtherLicenseUrl; }
private void OnEnable() { if (target == null) { return; } m_target = (VRM10MetaObject)target; m_Script = serializedObject.FindProperty("m_Script"); m_exporterVersion = serializedObject.FindProperty(nameof(m_target.ExporterVersion)); m_thumbnail = serializedObject.FindProperty(nameof(m_target.Thumbnail)); m_title = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.Name)), prop => { if (string.IsNullOrEmpty(prop.stringValue)) { return(RequiredMessage(prop.name), MessageType.Error); }
protected override void Clear() { // m_settingsInspector UnityEditor.Editor.DestroyImmediate(m_settingsInspector); m_settingsInspector = null; // m_meshesInspector UnityEditor.Editor.DestroyImmediate(m_meshesInspector); m_meshesInspector = null; // Meta Meta = null; ScriptableObject.DestroyImmediate(m_tmpMeta); m_tmpMeta = null; // m_settings ScriptableObject.DestroyImmediate(m_settings); m_settings = null; // m_meshes ScriptableObject.DestroyImmediate(m_meshes); m_meshes = null; }
void OnEnable() { // Debug.Log("OnEnable"); Undo.willFlushUndoRecord += Repaint; Selection.selectionChanged += Repaint; m_tmpMeta = ScriptableObject.CreateInstance <VRM10MetaObject>(); m_tmpMeta.Authors = new List <string> { "" }; m_state = new MeshUtility.ExporterDialogState(); m_state.ExportRootChanged += (root) => { // update meta if (root == null) { Meta = null; } else { var controller = root.GetComponent <VRM10Controller>(); if (controller != null) { Meta = controller.Meta; } else { Meta = null; } // default setting // m_settings.PoseFreeze = // MeshUtility.Validators.HumanoidValidator.HasRotationOrScale(root) // || m_meshes.Meshes.Any(x => x.ExportBlendShapeCount > 0 && !x.HasSkinning) // ; } Repaint(); }; m_state.ExportRoot = Selection.activeObject as GameObject; }
protected override void Initialize() { m_tmpMeta = ScriptableObject.CreateInstance <VRM10MetaObject>(); m_tmpMeta.Authors = new List <string> { "" }; m_settings = ScriptableObject.CreateInstance <VRM10ExportSettings>(); m_settingsInspector = Editor.CreateEditor(m_settings); m_meshes = ScriptableObject.CreateInstance <MeshExportValidator>(); m_meshesInspector = Editor.CreateEditor(m_meshes); State.ExportRootChanged += (root) => { // update meta if (root == null) { Meta = null; } else { var controller = root.GetComponent <VRM10Controller>(); if (controller != null) { Meta = controller.Meta.Meta; } else { Meta = null; } // default setting // m_settings.PoseFreeze = // MeshUtility.Validators.HumanoidValidator.HasRotationOrScale(root) // || m_meshes.Meshes.Any(x => x.ExportBlendShapeCount > 0 && !x.HasSkinning) // ; } }; }
/// <summary> /// metaObject が null のときは、root から取得する /// </summary> public VrmLib.Model ToModelFrom10(GameObject root, VRM10MetaObject metaObject = null) { Model = new VrmLib.Model(VrmLib.Coordinates.Unity); if (metaObject is null) { var vrmController = root.GetComponent <VRM10Controller>(); if (vrmController is null || vrmController.Meta is null) { throw new NullReferenceException("metaObject is null"); } metaObject = vrmController.Meta; } ToGlbModel(root); // humanoid { var humanoid = root.GetComponent <MeshUtility.Humanoid>(); if (humanoid is null) { humanoid = root.AddComponent <MeshUtility.Humanoid>(); humanoid.AssignBonesFromAnimator(); } foreach (HumanBodyBones humanBoneType in Enum.GetValues(typeof(HumanBodyBones))) { var transform = humanoid.GetBoneTransform(humanBoneType); if (transform != null && Nodes.TryGetValue(transform.gameObject, out VrmLib.Node node)) { node.HumanoidBone = (VrmLib.HumanoidBones)Enum.Parse(typeof(VrmLib.HumanoidBones), humanBoneType.ToString(), true); } } } return(Model); }
public void Export(GameObject root, Model model, ModelExporter converter, ExportArgs option, gltfExporter.GetBytesWithMimeFromTexture2D getTextureBytes, VRM10MetaObject metaObject = null) { ExportAsset(model); /// /// 必要な容量を先に確保 /// (sparseは考慮してないので大きめ) /// { var reserveBytes = 0; // mesh foreach (var g in model.MeshGroups) { foreach (var mesh in g.Meshes) { // 頂点バッファ reserveBytes += mesh.IndexBuffer.ByteLength; foreach (var kv in mesh.VertexBuffer) { reserveBytes += kv.Value.ByteLength; } // morph foreach (var morph in mesh.MorphTargets) { foreach (var kv in morph.VertexBuffer) { reserveBytes += kv.Value.ByteLength; } } } } Reserve(reserveBytes); } // material var materialExporter = new Vrm10MaterialExporter(); foreach (Material material in model.Materials) { var glTFMaterial = materialExporter.ExportMaterial(material, m_textureExporter); Storage.Gltf.materials.Add(glTFMaterial); } // mesh ExportMeshes(model.MeshGroups, model.Materials, option); // node ExportNodes(model.Root, model.Nodes, model.MeshGroups, option); var(vrm, vrmSpringBone, thumbnailTextureIndex) = ExportVrm(root, model, converter, metaObject); // Extension で Texture が増える場合があるので最後に呼ぶ for (int i = 0; i < m_textureExporter.Exported.Count; ++i) { var(unityTexture, texColorSpace) = m_textureExporter.Exported[i]; Storage.Gltf.PushGltfTexture(0, unityTexture, texColorSpace, getTextureBytes); } if (thumbnailTextureIndex.HasValue) { vrm.Meta.ThumbnailImage = Storage.Gltf.textures[thumbnailTextureIndex.Value].source; } UniGLTF.Extensions.VRMC_vrm.GltfSerializer.SerializeTo(ref Storage.Gltf.extensions, vrm); if (vrmSpringBone != null) { UniGLTF.Extensions.VRMC_springBone.GltfSerializer.SerializeTo(ref Storage.Gltf.extensions, vrmSpringBone); } }
/// <summary> /// metaObject が null のときは、root から取得する /// </summary> public VrmLib.Model ToModelFrom10(GameObject root, VRM10MetaObject metaObject = null) { Model = new VrmLib.Model(VrmLib.Coordinates.Unity); if (metaObject is null) { var vrmController = root.GetComponent <VRM10Controller>(); if (vrmController is null || vrmController.Meta is null) { throw new NullReferenceException("metaObject is null"); } metaObject = vrmController.Meta; } ToGlbModel(root); // meta var meta = new VrmLib.Meta(); meta.Name = metaObject.Name; meta.Version = metaObject.Version; meta.CopyrightInformation = metaObject.CopyrightInformation; meta.Authors.AddRange(metaObject.Authors); meta.ContactInformation = metaObject.ContactInformation; meta.Reference = metaObject.Reference; meta.Thumbnail = metaObject.Thumbnail.ToPngImage(VrmLib.ImageUsage.None); meta.AvatarPermission = new VrmLib.AvatarPermission { AvatarUsage = metaObject.AllowedUser, IsAllowedViolentUsage = metaObject.ViolentUsage, IsAllowedSexualUsage = metaObject.SexualUsage, CommercialUsage = metaObject.CommercialUsage, IsAllowedGameUsage = metaObject.GameUsage, IsAllowedPoliticalOrReligiousUsage = metaObject.PoliticalOrReligiousUsage, OtherPermissionUrl = metaObject.OtherPermissionUrl, }; meta.RedistributionLicense = new VrmLib.RedistributionLicense { CreditNotation = metaObject.CreditNotation, IsAllowRedistribution = metaObject.Redistribution, ModificationLicense = metaObject.ModificationLicense, OtherLicenseUrl = metaObject.OtherLicenseUrl, }; Model.Vrm = new VrmLib.Vrm(meta, UniVRM10.VRMVersion.VERSION, UniVRM10.VRMSpecVersion.Version); // humanoid { var humanoid = root.GetComponent <MeshUtility.Humanoid>(); if (humanoid is null) { humanoid = root.AddComponent <MeshUtility.Humanoid>(); humanoid.AssignBonesFromAnimator(); } foreach (HumanBodyBones humanBoneType in Enum.GetValues(typeof(HumanBodyBones))) { var transform = humanoid.GetBoneTransform(humanBoneType); if (transform != null && Nodes.TryGetValue(transform.gameObject, out VrmLib.Node node)) { node.HumanoidBone = (VrmLib.HumanoidBones)Enum.Parse(typeof(VrmLib.HumanoidBones), humanBoneType.ToString(), true); } } } // blendShape var controller = root.GetComponent <UniVRM10.VRM10Controller>(); if (controller != null) { { Model.Vrm.ExpressionManager = new VrmLib.ExpressionManager(); if (controller != null) { foreach (var clip in controller.Expression.ExpressionAvatar.Clips) { var expression = ToVrmLib(clip, root); if (expression != null) { Model.Vrm.ExpressionManager.ExpressionList.Add(expression); } } } } // firstPerson { var firstPerson = new VrmLib.FirstPerson(); if (controller != null) { foreach (var annotation in controller.FirstPerson.Renderers) { firstPerson.Annotations.Add( new VrmLib.FirstPersonMeshAnnotation(Nodes[annotation.Renderer.gameObject], annotation.FirstPersonFlag) ); } Model.Vrm.FirstPerson = firstPerson; } } // lookAt { var lookAt = new VrmLib.LookAt(); if (controller != null) { if (controller.LookAt.LookAtType == VRM10ControllerLookAt.LookAtTypes.Expression) { lookAt.HorizontalInner = new VrmLib.LookAtRangeMap(); lookAt.HorizontalOuter = new VrmLib.LookAtRangeMap() { InputMaxValue = controller.LookAt.HorizontalOuter.CurveXRangeDegree, OutputScaling = controller.LookAt.HorizontalOuter.CurveYRangeDegree }; lookAt.VerticalUp = new VrmLib.LookAtRangeMap() { InputMaxValue = controller.LookAt.VerticalUp.CurveXRangeDegree, OutputScaling = controller.LookAt.VerticalUp.CurveYRangeDegree, }; lookAt.VerticalDown = new VrmLib.LookAtRangeMap() { InputMaxValue = controller.LookAt.VerticalDown.CurveXRangeDegree, OutputScaling = controller.LookAt.VerticalDown.CurveYRangeDegree, }; } else if (controller.LookAt.LookAtType == VRM10ControllerLookAt.LookAtTypes.Bone) { lookAt.HorizontalInner = new VrmLib.LookAtRangeMap() { InputMaxValue = controller.LookAt.HorizontalInner.CurveXRangeDegree, OutputScaling = controller.LookAt.HorizontalInner.CurveYRangeDegree }; lookAt.HorizontalOuter = new VrmLib.LookAtRangeMap() { InputMaxValue = controller.LookAt.HorizontalOuter.CurveXRangeDegree, OutputScaling = controller.LookAt.HorizontalOuter.CurveYRangeDegree }; lookAt.VerticalUp = new VrmLib.LookAtRangeMap() { InputMaxValue = controller.LookAt.VerticalUp.CurveXRangeDegree, OutputScaling = controller.LookAt.VerticalUp.CurveYRangeDegree, }; lookAt.VerticalDown = new VrmLib.LookAtRangeMap() { InputMaxValue = controller.LookAt.VerticalDown.CurveXRangeDegree, OutputScaling = controller.LookAt.VerticalDown.CurveYRangeDegree, }; } lookAt.OffsetFromHeadBone = controller.LookAt.OffsetFromHead.ToNumericsVector3(); } Model.Vrm.LookAt = lookAt; } // springBone { var springBoneManager = controller.SpringBone; foreach (var springBone in springBoneManager.Springs) { var vrmSpringBone = new VrmLib.SpringBone() { Comment = springBone.m_comment, Origin = (springBone.m_center != null) ? Nodes[springBone.m_center.gameObject] : null, }; foreach (var joint in springBone.Joints) { vrmSpringBone.Joints.Add(new VrmLib.SpringJoint(Nodes[joint.Transform.gameObject]) { Stiffness = joint.m_stiffnessForce, GravityPower = joint.m_gravityPower, GravityDir = joint.m_gravityDir.ToNumericsVector3(), DragForce = joint.m_dragForce, HitRadius = joint.m_jointRadius, Exclude = joint.m_exclude, }); } foreach (var colliderGroup in springBone.ColliderGroups) { var colliderGroups = colliderGroup.Colliders.Select(x => { switch (x.ColliderType) { case VRM10SpringBoneColliderTypes.Sphere: return(VrmLib.VrmSpringBoneCollider.CreateSphere(x.Offset.ToNumericsVector3(), x.Radius)); case VRM10SpringBoneColliderTypes.Capsule: return(VrmLib.VrmSpringBoneCollider.CreateCapsule(x.Offset.ToNumericsVector3(), x.Radius, x.Tail.ToNumericsVector3())); default: throw new NotImplementedException(); } }); var vrmColliderGroup = new VrmLib.SpringBoneColliderGroup(Nodes[colliderGroup.gameObject], colliderGroups); vrmSpringBone.Colliders.Add(vrmColliderGroup); } Model.Vrm.SpringBone.Springs.Add(vrmSpringBone); } } } return(Model); }