Streamingle_URP/Assets/External/UniGLTF/Editor/TopMenuImplementation.cs

102 lines
3.6 KiB
C#

using System.IO;
using UnityEditor;
using UnityEngine;
namespace UniGLTF
{
public static class TopMenuImplementation
{
public static void ExportGameObjectToGltfFile()
{
var window = (GltfExportWindow)GltfExportWindow.GetWindow(typeof(GltfExportWindow));
window.titleContent = new GUIContent("Gltf Exporter");
window.Show();
}
public static void ImportGltfFileToGameObject()
{
var path = EditorUtility.OpenFilePanel("open glb", "", "gltf,glb,zip");
if (string.IsNullOrEmpty(path))
{
return;
}
if (Application.isPlaying)
{
//
// load into scene
//
var data = new AutoGltfFileParser(path).Parse();
using (var context = new ImporterContext(data))
{
var loaded = context.Load();
loaded.ShowMeshes();
Selection.activeGameObject = loaded.gameObject;
}
return;
}
//
// save as asset
//
if (path.StartsWithUnityAssetPath())
{
Debug.LogWarningFormat("disallow import from folder under the Assets");
return;
}
var ext = Path.GetExtension(path).ToLower();
var assetPath = EditorUtility.SaveFilePanel("save prefab", "Assets", Path.GetFileNameWithoutExtension(path), ext.Substring(1));
if (string.IsNullOrEmpty(assetPath))
{
return;
}
// copy
var bytes = File.ReadAllBytes(path);
File.WriteAllBytes(assetPath, bytes);
if (ext == ".gltf")
{
// copy associated files
var src_dir = Path.GetDirectoryName(path);
var dst_dir = Path.GetDirectoryName(assetPath);
var data = new GltfFileWithResourceFilesParser(path, bytes).Parse();
foreach (var buffer in data.GLTF.buffers)
{
if (!string.IsNullOrEmpty(buffer.uri))
{
var src_path = Path.Combine(src_dir, buffer.uri);
var src_bytes = File.ReadAllBytes(src_path);
var dst_path = Path.Combine(dst_dir, buffer.uri);
File.WriteAllBytes(dst_path, src_bytes);
UnityPath.FromFullpath(dst_path).ImportAsset();
}
}
foreach (var buffer in data.GLTF.images)
{
if (!string.IsNullOrEmpty(buffer.uri))
{
var src_path = Path.Combine(src_dir, buffer.uri);
var src_bytes = File.ReadAllBytes(src_path);
var dst_path = Path.Combine(dst_dir, buffer.uri);
File.WriteAllBytes(dst_path, src_bytes);
UnityPath.FromFullpath(dst_path).ImportAsset();
}
}
}
// import as asset
var unitypath = UnityPath.FromFullpath(assetPath);
unitypath.ImportAsset();
var asset = unitypath.LoadAsset<GameObject>();
Selection.activeObject = asset;
}
public static void GenerateSerializationCode()
{
SerializerGenerator.GenerateSerializer();
DeserializerGenerator.GenerateSerializer();
}
}
}