public void ImportExportTest() { var path = UniGLTF.UnityPath.FromUnityPath("Models/Alicia_vrm-0.40/AliciaSolid_vrm-0.40.vrm"); var context = new VRMImporterContext(path); context.ParseGlb(File.ReadAllBytes(path.FullPath)); VRMImporter.LoadFromBytes(context); using (new ActionDisposer(() => { GameObject.DestroyImmediate(context.Root); })) { var importJson = JsonParser.Parse(context.Json); importJson.SetValue("/extensions/VRM/exporterVersion", VRMVersion.VRM_VERSION); importJson.SetValue("/asset/generator", UniGLTF.UniGLTFVersion.UNIGLTF_VERSION); importJson.SetValue("/scene", 0); importJson.SetValue("/materials/*/doubleSided", false); //importJson.SetValue("/materials/*/pbrMetallicRoughness/roughnessFactor", 0); //importJson.SetValue("/materials/*/pbrMetallicRoughness/baseColorFactor", new float[] { 1, 1, 1, 1 }); importJson.SetValue("/accessors/*/normalized", false); importJson.RemoveValue("/nodes/*/extras"); importJson.SetValue("/bufferViews/12/byteStride", 4); importJson.SetValue("/bufferViews/13/byteStride", 4); importJson.SetValue("/bufferViews/14/byteStride", 4); importJson.SetValue("/bufferViews/15/byteStride", 4); importJson.SetValue("/bufferViews/22/byteStride", 4); importJson.SetValue("/bufferViews/29/byteStride", 4); importJson.SetValue("/bufferViews/45/byteStride", 4); importJson.SetValue("/bufferViews/46/byteStride", 4); importJson.SetValue("/bufferViews/47/byteStride", 4); importJson.SetValue("/bufferViews/201/byteStride", 4); importJson.SetValue("/bufferViews/202/byteStride", 4); importJson.SetValue("/bufferViews/203/byteStride", 4); importJson.SetValue("/bufferViews/204/byteStride", 4); importJson.SetValue("/bufferViews/211/byteStride", 4); importJson.SetValue("/bufferViews/212/byteStride", 4); importJson.SetValue("/bufferViews/213/byteStride", 4); importJson.SetValue("/bufferViews/214/byteStride", 4); importJson.SetValue("/bufferViews/215/byteStride", 4); importJson.SetValue("/bufferViews/243/byteStride", 4); importJson.SetValue("/bufferViews/247/byteStride", 64); importJson.SetValue("/bufferViews/248/byteStride", 64); importJson.SetValue("/bufferViews/249/byteStride", 64); importJson.SetValue("/bufferViews/250/byteStride", 64); importJson.SetValue("/bufferViews/251/byteStride", 64); importJson.SetValue("/bufferViews/252/byteStride", 64); importJson.SetValue("/bufferViews/253/byteStride", 64); var vrm = VRMExporter.Export(context.Root); var exportJson = JsonParser.Parse(vrm.ToJson()); foreach (var kv in importJson.Diff(exportJson)) { Debug.Log(kv); } Assert.AreEqual(importJson, exportJson); } }
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { foreach (string path in importedAssets) { var ext = Path.GetExtension(path).ToLower(); if (ext == ".vrm") { var context = new VRMImporterContext(path); context.ParseVrm(File.ReadAllBytes(context.Path)); // // https://answers.unity.com/questions/647615/how-to-update-import-settings-for-newly-created-as.html // for (int i = 0; i < context.GLTF.textures.Count; ++i) { var x = context.GLTF.textures[i]; var image = context.GLTF.images[x.source]; if (string.IsNullOrEmpty(image.uri)) { // glb buffer var folder = context.GetAssetFolder(".Textures").AssetPathToFullPath(); if (!Directory.Exists(folder)) { UnityEditor.AssetDatabase.CreateFolder(context.GLTF.baseDir, Path.GetFileNameWithoutExtension(context.Path) + ".Textures"); //Directory.CreateDirectory(folder); } var textureName = !string.IsNullOrEmpty(image.name) ? image.name: string.Format("buffer#{0:00}", i); var png = Path.Combine(folder, textureName + ".png"); var byteSegment = context.GLTF.GetViewBytes(image.bufferView); File.WriteAllBytes(png, byteSegment.ToArray()); var assetPath = png.ToUnityRelativePath(); //Debug.LogFormat("import asset {0}", assetPath); UnityEditor.AssetDatabase.ImportAsset(assetPath, UnityEditor.ImportAssetOptions.ForceUpdate); UnityEditor.AssetDatabase.Refresh(); image.uri = assetPath.Substring(context.GLTF.baseDir.Length + 1); } } EditorApplication.delayCall += () => { // delay and can import png texture VRMImporter.LoadFromBytes(context); context.SaveAsAsset(); context.Destroy(false); }; } } }
public void MeshCoyTest() { var path = UniGLTF.UnityPath.FromUnityPath("Models/Alicia_vrm-0.40/AliciaSolid_vrm-0.40.vrm"); var context = new VRMImporterContext(); context.ParseGlb(File.ReadAllBytes(path.FullPath)); VRMImporter.LoadFromBytes(context); foreach (var mesh in context.Meshes) { var src = mesh.Mesh; var dst = src.Copy(true); MeshTests.MeshEquals(src, dst); } }
static void Import(string readPath, UnityPath prefabPath) { var bytes = File.ReadAllBytes(readPath); var context = new VRMImporterContext(UnityPath.FromFullpath(readPath)); context.ParseGlb(File.ReadAllBytes(readPath)); context.SaveTexturesAsPng(prefabPath); EditorApplication.delayCall += () => { // delay and can import png texture VRMImporter.LoadFromBytes(context); context.SaveAsAsset(prefabPath); context.Destroy(false); }; }
/// <summary> /// メタが不要な場合のローダー /// </summary> void LoadVRMClicked_without_meta() { #if UNITY_STANDALONE_WIN var path = FileDialogForWindows.FileDialog("open VRM", ".vrm"); #else var path = Application.dataPath + "/default.vrm"; #endif if (string.IsNullOrEmpty(path)) { return; } #if true var bytes = File.ReadAllBytes(path); // なんらかの方法でByte列を得た if (m_loadAsync) { // ローカルファイルシステムからロードします VRMImporter.LoadVrmAsync(bytes, OnLoaded); } else { var root = VRMImporter.LoadFromBytes(bytes); OnLoaded(root); } #else // ParseしたJSONをシーンオブジェクトに変換していく if (m_loadAsync) { // ローカルファイルシステムからロードします VRMImporter.LoadVrmAsync(path, OnLoaded); } else { var root = VRMImporter.LoadFromPath(path); OnLoaded(root); } #endif }
static void ImportVrm(UnityPath path) { if (!path.IsUnderAssetsFolder) { throw new Exception(); } var context = new VRMImporterContext(path); context.ParseGlb(File.ReadAllBytes(path.FullPath)); var prefabPath = path.Parent.Child(path.FileNameWithoutExtension + ".prefab"); context.SaveTexturesAsPng(prefabPath); EditorApplication.delayCall += () => { // delay and can import png texture VRMImporter.LoadFromBytes(context); context.SaveAsAsset(prefabPath); context.Destroy(false); }; }
void LoadVRMClicked() { #if UNITY_STANDALONE_WIN var path = FileDialogForWindows.FileDialog("open VRM", ".vrm"); #else var path = Application.dataPath + "/default.vrm"; #endif if (string.IsNullOrEmpty(path)) { return; } var bytes = File.ReadAllBytes(path); // なんらかの方法でByte列を得た var context = new VRMImporterContext(path); // GLB形式でJSONを取得しParseします context.ParseVrm(bytes); // metaを取得(todo: thumbnailテクスチャのロード) var meta = context.ReadMeta(); Debug.LogFormat("meta: title:{0}", meta.Title); // ParseしたJSONをシーンオブジェクトに変換していく if (m_loadAsync) { LoadAsync(context); } else { VRMImporter.LoadFromBytes(context); OnLoaded(context.Root); } }