public void TextureNameUniqueness() { var data = new ExportingGltfData(); var gltf = data.Gltf; gltf.asset.version = "2.0"; gltf.textures.Add(new glTFTexture { name = "FooBar", source = 0, }); gltf.textures.Add(new glTFTexture { name = "foobar", source = 1, }); gltf.images.Add(new glTFImage { name = "HogeFuga", }); gltf.images.Add(new glTFImage { name = "hogefuga", }); var parser = new GlbLowLevelParser("Test", data.ToGlbBytes()); using (var parsed = parser.Parse()) { Assert.AreEqual("FooBar", parsed.GLTF.textures[0].name); // NOTE: 大文字小文字が違うだけの名前は、同一としてみなされ、Suffix が付く。 Assert.AreEqual("foobar__UNIGLTF__DUPLICATED__2", parsed.GLTF.textures[1].name); } }
protected override void ExportPath(string path) { var ext = Path.GetExtension(path).ToLower(); var isGlb = false; switch (ext) { case ".glb": isGlb = true; break; case ".gltf": isGlb = false; break; default: throw new System.Exception(); } var progress = 0; EditorUtility.DisplayProgressBar("export gltf", path, progress); try { var data = new ExportingGltfData(); using (var exporter = new gltfExporter(data, Settings, new EditorProgress())) { exporter.Prepare(State.ExportRoot); exporter.Export(new EditorTextureSerializer()); } if (isGlb) { var bytes = data.ToGlbBytes(); File.WriteAllBytes(path, bytes); } else { var(json, buffer0) = data.ToGltf(path); { // write JSON without BOM var encoding = new System.Text.UTF8Encoding(false); File.WriteAllText(path, json, encoding); } { // write to buffer0 local folder var dir = Path.GetDirectoryName(path); var bufferPath = Path.Combine(dir, buffer0.uri); File.WriteAllBytes(bufferPath, data.BinBytes.ToArray()); } } if (path.StartsWithUnityAssetPath()) { AssetDatabase.ImportAsset(path.ToUnityRelativePath()); AssetDatabase.Refresh(); } } finally { EditorUtility.ClearProgressBar(); } }
static Byte[] Export(GameObject root) { var data = new ExportingGltfData(); using (var exporter = new gltfExporter(data, new GltfExportSettings())) { exporter.Prepare(root); exporter.Export(new EditorTextureSerializer()); } return(data.ToGlbBytes()); }
/// <summary> /// /// </summary> /// <param name="path"></param> /// <param name="settings"></param> /// <param name="destroy">作業が終わったらDestoryするべき一時オブジェクト</param> static byte[] Export(GameObject exportRoot, VRMMetaObject meta, VRMExportSettings settings, List <GameObject> destroy) { var target = exportRoot; // 常にコピーする。シーンを変化させない target = GameObject.Instantiate(target); destroy.Add(target); var metaBehaviour = target.GetComponent <VRMMeta>(); if (metaBehaviour == null) { metaBehaviour = target.AddComponent <VRMMeta>(); metaBehaviour.Meta = meta; } if (metaBehaviour.Meta == null) { // 来ないはず throw new Exception("meta required"); } { // copy元 var animator = exportRoot.GetComponent <Animator>(); var beforeTransforms = exportRoot.GetComponentsInChildren <Transform>(); // copy先 var afterTransforms = target.GetComponentsInChildren <Transform>(); // copy先のhumanoidBoneのリストを得る var bones = (HumanBodyBones[])Enum.GetValues(typeof(HumanBodyBones)); var humanTransforms = bones .Where(x => x != HumanBodyBones.LastBone) .Select(x => animator.GetBoneTransform(x)) .Where(x => x != null) .Select(x => afterTransforms[Array.IndexOf(beforeTransforms, x)]) // copy 先を得る .ToArray(); var nameCount = target.GetComponentsInChildren <Transform>() .GroupBy(x => x.name) .ToDictionary(x => x.Key, x => x.Count()); foreach (var t in target.GetComponentsInChildren <Transform>()) { if (humanTransforms.Contains(t)) { // keep original name continue; } if (nameCount[t.name] > 1) { // 重複するボーン名をリネームする ForceUniqueName(t, nameCount); } } } // 正規化 if (settings.PoseFreeze) { // BoneNormalizer.Execute は Copy を作って正規化する。UNDO無用 target = VRMBoneNormalizer.Execute(target, settings.ForceTPose); destroy.Add(target); } var fp = target.GetComponent <VRMFirstPerson>(); // 元のBlendShapeClipに変更を加えないように複製 var proxy = target.GetComponent <VRMBlendShapeProxy>(); if (proxy != null) { var copyBlendShapeAvatar = CopyBlendShapeAvatar(proxy.BlendShapeAvatar, settings.ReduceBlendshapeClip); proxy.BlendShapeAvatar = copyBlendShapeAvatar; // BlendShape削減 if (settings.ReduceBlendshape) { foreach (SkinnedMeshRenderer smr in target.GetComponentsInChildren <SkinnedMeshRenderer>()) { // 未使用のBlendShapeを間引く ReplaceMesh(target, smr, copyBlendShapeAvatar); } } } // 出力 var sw = System.Diagnostics.Stopwatch.StartNew(); var data = new UniGLTF.ExportingGltfData(); using (var exporter = new VRMExporter(data, settings.MeshExportSettings)) { exporter.Prepare(target); exporter.Export(new EditorTextureSerializer()); } var bytes = data.ToGlbBytes(); Debug.LogFormat("Export elapsed {0}", sw.Elapsed); return(bytes); }