Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
        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);
                }
Exemplo n.º 3
0
 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;
        }
Exemplo n.º 5
0
        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)
                    // ;
                }
            };
        }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 8
0
        /// <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);
        }