Exemple #1
0
        public void VRMLookAtTest()
        {
            var parser = new GltfParser();

            parser.ParsePath(AliciaPath);
            byte[] bytes = default;
            using (var loader = new VRMImporterContext(parser))
            {
                loader.Load();
                loader.ShowMeshes();

                var go = loader.Root;
                var fp = go.GetComponent <VRMFirstPerson>();
                GameObject.DestroyImmediate(go.GetComponent <VRMLookAtBoneApplyer>());
                go.AddComponent <VRMLookAtBlendShapeApplyer>();
                bytes = VRMEditorExporter.Export(go, null, new VRMExportSettings
                {
                    PoseFreeze = true,
                });
            }

            var parser2 = new GltfParser();

            parser2.Parse(AliciaPath, bytes);
            var loader2 = new VRMImporterContext(parser2);

            Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType);
        }
Exemple #2
0
        static void ImportMenu()
        {
            var path = EditorUtility.OpenFilePanel("open vrm", "", "vrm");

            if (string.IsNullOrEmpty(path))
            {
                return;
            }

            if (Application.isPlaying)
            {
                // load into scene
                var parser = new GltfParser();
                parser.ParsePath(path);

                using (var context = new VRMImporterContext(parser))
                {
                    context.Load();
                    context.EnableUpdateWhenOffscreen();
                    context.ShowMeshes();
                    context.DisposeOnGameObjectDestroyed();
                    Selection.activeGameObject = context.Root;
                }
            }
            else
            {
                if (path.StartsWithUnityAssetPath())
                {
                    Debug.LogWarningFormat("disallow import from folder under the Assets");
                    return;
                }

                var assetPath = EditorUtility.SaveFilePanel("save prefab", "Assets", Path.GetFileNameWithoutExtension(path), "prefab");
                if (string.IsNullOrEmpty(path))
                {
                    return;
                }

                if (!assetPath.StartsWithUnityAssetPath())
                {
                    Debug.LogWarningFormat("out of asset path: {0}", assetPath);
                    return;
                }

                // import as asset
                var prefabPath = UnityPath.FromUnityPath(assetPath);
                var parser     = new GltfParser();
                parser.ParseGlb(File.ReadAllBytes(path));

                Action <IEnumerable <string> > onCompleted = texturePaths =>
                {
                    //
                    // after textures imported
                    //
                    var map = texturePaths.Select(x =>
                    {
                        var texture = AssetDatabase.LoadAssetAtPath(x, typeof(Texture2D));
                        return(texture.name, texture);
                    }).ToArray();
Exemple #3
0
        static void ImportMenu()
        {
            var path = EditorUtility.OpenFilePanel("open vrm", "", "vrm");

            if (string.IsNullOrEmpty(path))
            {
                return;
            }

            if (Application.isPlaying)
            {
                // load into scene
                var parser = new GltfParser();
                parser.ParsePath(path);
                var context = new VRMImporterContext(parser);
                context.Load();
                context.ShowMeshes();
                context.EnableUpdateWhenOffscreen();
                Selection.activeGameObject = context.Root;
            }
            else
            {
                if (path.StartsWithUnityAssetPath())
                {
                    Debug.LogWarningFormat("disallow import from folder under the Assets");
                    return;
                }

                var assetPath = EditorUtility.SaveFilePanel("save prefab", "Assets", Path.GetFileNameWithoutExtension(path), "prefab");
                if (string.IsNullOrEmpty(path))
                {
                    return;
                }

                if (!assetPath.StartsWithUnityAssetPath())
                {
                    Debug.LogWarningFormat("out of asset path: {0}", assetPath);
                    return;
                }

                // import as asset
                var prefabPath = UnityPath.FromUnityPath(assetPath);
                var parser     = new GltfParser();
                parser.ParseGlb(File.ReadAllBytes(path));
                var context = new VRMImporterContext(parser);
                var editor  = new VRMEditorImporterContext(context);
                editor.ExtractImages(prefabPath);

                EditorApplication.delayCall += () =>
                {
                    //
                    // after textures imported
                    //
                    context.Load();
                    editor.SaveAsAsset(prefabPath);
                    editor.Dispose();
                };
            }
        }
Exemple #4
0
 /// <summary>
 /// VRM1 で パースし、失敗したら Migration してから VRM1 でパースする
 /// </summary>
 /// <param name="path"></param>
 /// <param name="migrateToVrm1"></param>
 /// <returns></returns>
 public static string TryParseOrMigrate(string path, bool migrateToVrm1, out GltfParser parser)
 {
     //
     // Parse(parse glb, parser gltf json)
     //
     parser = new GltfParser();
     parser.ParsePath(path);
     if (UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(parser.GLTF.extensions, out UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm))
     {
         // success
         return(default);
Exemple #5
0
        public void MaterialImporterTest()
        {
            var parser = new GltfParser();

            parser.ParsePath(AliciaPath);
            var vrmImporter   = new VRMImporterContext(parser, null);
            var materialParam = new VRMMaterialImporter(vrmImporter.VRM).GetMaterialParam(parser, 0);

            Assert.AreEqual("VRM/MToon", materialParam.ShaderName);
            Assert.AreEqual("Alicia_body", materialParam.TextureSlots["_MainTex"].UnityObjectName);

            var(key, value) = materialParam.EnumerateSubAssetKeyValue().First();
            Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "Alicia_body"), key);
        }
        static void ImportRuntime(string path)
        {
            // load into scene
            var parser = new GltfParser();

            parser.ParsePath(path);

            using (var context = new VRMImporterContext(parser))
            {
                context.Load();
                context.EnableUpdateWhenOffscreen();
                context.ShowMeshes();
                context.DisposeOnGameObjectDestroyed();
                Selection.activeGameObject = context.Root;
            }
        }
Exemple #7
0
        public void MToonMaterialParamTest()
        {
            if (!VRMTestAssets.TryGetPath("Models/VRoid/VictoriaRubin/VictoriaRubin.vrm", out string path))
            {
                return;
            }

            var parser = new GltfParser();

            parser.ParsePath(path);

            var importer = new VRMImporterContext(parser, null);

            var materialImporter = new VRMMaterialImporter(importer.VRM);

            Assert.AreEqual(73, parser.GLTF.materials.Count);
            Assert.True(materialImporter.TryCreateParam(parser, 0, out MaterialImportParam param));
        }
Exemple #8
0
        static GameObject Load(FileInfo gltf, DirectoryInfo root, byte[] bytes = null)
        {
            var parser = new GltfParser();

            try
            {
                if (bytes != null)
                {
                    parser.Parse(gltf.FullName, bytes);
                }
                else
                {
                    parser.ParsePath(gltf.FullName);
                }
            }
            catch (Exception ex)
            {
                Debug.LogError($"ParseError: {gltf}");
                Debug.LogException(ex);
                return(null);
            }

            try
            {
                using (var importer = new VRMImporterContext(parser))
                {
                    importer.Load();
                    return(importer.DisposeOnGameObjectDestroyed().gameObject);
                }
            }
            catch (Exception ex)
            {
                Message(gltf.FullName.Substring(root.FullName.Length), ex);
                return(null);
            }
        }
Exemple #9
0
        public void VRMLookAtCurveMapTest()
        {
            var parser = new GltfParser();

            parser.ParsePath(AliciaPath);
            byte[]      bytes           = default;
            CurveMapper horizontalInner = default;

            using (var loader = new VRMImporterContext(parser))
            {
                loader.Load();
                loader.ShowMeshes();

                var go     = loader.Root;
                var fp     = go.GetComponent <VRMFirstPerson>();
                var lookAt = go.GetComponent <VRMLookAtBoneApplyer>();
                horizontalInner = lookAt.HorizontalInner;
                bytes           = VRMEditorExporter.Export(go, null, new VRMExportSettings
                {
                    PoseFreeze = false,
                });
            }

            var parser2 = new GltfParser();

            parser2.Parse(AliciaPath, bytes);
            using (var loader = new VRMImporterContext(parser2))
            {
                loader.Load();
                loader.ShowMeshes();

                var lookAt = loader.Root.GetComponent <VRMLookAtBoneApplyer>();
                Assert.AreEqual(horizontalInner.CurveXRangeDegree, lookAt.HorizontalInner.CurveXRangeDegree);
                Assert.AreEqual(horizontalInner.CurveYRangeDegree, lookAt.HorizontalInner.CurveYRangeDegree);
            }
        }
        /// <summary>
        /// VRM1 で パースし、失敗したら Migration してから VRM1 でパースする
        /// </summary>
        /// <param name="path"></param>
        /// <param name="migrateToVrm1"></param>
        /// <returns></returns>
        public static GltfParser Parse(string path, bool migrateToVrm1)
        {
            //
            // Parse(parse glb, parser gltf json)
            //
            var parser = new GltfParser();

            parser.ParsePath(path);
            if (UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(parser.GLTF.extensions, out UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm))
            {
                return(parser);
            }

            if (migrateToVrm1)
            {
                // try migrateion
                var migrated = MigrationVrm.Migrate(File.ReadAllBytes(path));
                parser = new GltfParser();
                parser.Parse(path, migrated);
                return(parser);
            }

            return(null);
        }
Exemple #11
0
        async void LoadModelAsync(string path)
        {
            if (!File.Exists(path))
            {
                return;
            }

            Debug.LogFormat("{0}", path);
            var ext = Path.GetExtension(path).ToLower();

            switch (ext)
            {
            case ".vrm":
            {
                var file = File.ReadAllBytes(path);

                var parser = new GltfParser();
                parser.ParseGlb(file);

                using (var context = new VRMImporterContext(parser))
                {
                    await m_texts.UpdateMetaAsync(context);

                    await context.LoadAsync();

                    context.EnableUpdateWhenOffscreen();
                    context.ShowMeshes();
                    context.DisposeOnGameObjectDestroyed();
                    SetModel(context.Root);
                }
                break;
            }

            case ".glb":
            {
                var file   = File.ReadAllBytes(path);
                var parser = new GltfParser();
                parser.ParseGlb(file);

                var context = new UniGLTF.ImporterContext(parser);
                context.Load();
                context.EnableUpdateWhenOffscreen();
                context.ShowMeshes();
                context.DisposeOnGameObjectDestroyed();
                SetModel(context.Root);
                break;
            }

            case ".gltf":
            case ".zip":
            {
                var parser = new GltfParser();
                parser.ParsePath(path);

                var context = new UniGLTF.ImporterContext(parser);
                context.Load();
                context.EnableUpdateWhenOffscreen();
                context.ShowMeshes();
                context.DisposeOnGameObjectDestroyed();
                SetModel(context.Root);
                break;
            }

            default:
                Debug.LogWarningFormat("unknown file type: {0}", path);
                break;
            }
        }
Exemple #12
0
        void LoadModel(string path)
        {
            if (!File.Exists(path))
            {
                return;
            }

            Debug.LogFormat("{0}", path);
            var ext = Path.GetExtension(path).ToLower();

            switch (ext)
            {
            case ".vrm":
            {
                var parser = new UniGLTF.GltfParser();
                parser.ParsePath(path);

                using (var loader = new RuntimeUnityBuilder(parser))
                {
                    loader.Load();
                    loader.ShowMeshes();
                    loader.EnableUpdateWhenOffscreen();
                    var destroyer = loader.DisposeOnGameObjectDestroyed();
                    SetModel(destroyer.gameObject);
                }
                break;
            }

            case ".glb":
            {
                var file   = File.ReadAllBytes(path);
                var parser = new GltfParser();
                parser.ParseGlb(file);

                using (var loader = new UniGLTF.ImporterContext(parser))
                {
                    loader.Load();
                    loader.ShowMeshes();
                    loader.EnableUpdateWhenOffscreen();
                    loader.ShowMeshes();
                    var destroyer = loader.DisposeOnGameObjectDestroyed();
                    SetModel(destroyer.gameObject);
                }
                break;
            }

            case ".gltf":
            case ".zip":
            {
                var parser = new GltfParser();
                parser.ParsePath(path);

                using (var loader = new UniGLTF.ImporterContext(parser))
                {
                    loader.Load();
                    loader.ShowMeshes();
                    loader.EnableUpdateWhenOffscreen();
                    loader.ShowMeshes();
                    var destroyer = loader.DisposeOnGameObjectDestroyed();
                    SetModel(destroyer.gameObject);
                }
                break;
            }

            default:
                Debug.LogWarningFormat("unknown file type: {0}", path);
                break;
            }
        }
Exemple #13
0
        void LoadModel(string path)
        {
            if (!File.Exists(path))
            {
                return;
            }

            Debug.LogFormat("{0}", path);
            var ext = Path.GetExtension(path).ToLower();

            switch (ext)
            {
            case ".vrm":
            {
                // var context = new ImporterContext();
                var file = File.ReadAllBytes(path);
                // context.ParseGlb(file);
                // context.Load();
                // context.ShowMeshes();
                // context.EnableUpdateWhenOffscreen();
                // context.ShowMeshes();

                var model = UniVRM10.VrmLoader.CreateVrmModel(file, new FileInfo(path));

                // UniVRM-0.XXのコンポーネントを構築する
                var assets = UniVRM10.RuntimeUnityBuilder.ToUnityAsset(model, showMesh: false);

                // showRenderer = false のときに後で表示する例
                foreach (var renderer in assets.Renderers)
                {
                    renderer.enabled = true;
                }

                UniVRM10.ComponentBuilder.Build10(model, assets);

                SetModel(assets.Root);
                break;
            }

            case ".glb":
            {
                var file   = File.ReadAllBytes(path);
                var parser = new GltfParser();
                parser.ParseGlb(file);

                var context = new UniGLTF.ImporterContext(parser);
                context.Load();
                context.ShowMeshes();
                context.EnableUpdateWhenOffscreen();
                context.ShowMeshes();
                SetModel(context.Root);
                break;
            }

            case ".gltf":
            case ".zip":
            {
                var parser = new GltfParser();
                parser.ParsePath(path);

                var context = new UniGLTF.ImporterContext(parser);
                context.Load();
                context.ShowMeshes();
                context.EnableUpdateWhenOffscreen();
                context.ShowMeshes();
                SetModel(context.Root);
                break;
            }

            default:
                Debug.LogWarningFormat("unknown file type: {0}", path);
                break;
            }
        }