using System;
using System.Threading.Tasks;
using GLTFast;
using UnityEngine;
namespace MyInfoMate.Vr.Scene
{
///
/// Chargement d'un GLB au runtime, jamais par glisser-déposer dans l'éditeur.
/// C'est toute la différence : un asset posé dans la scène part dans l'APK et fige
/// le contenu au build. Ici, le fichier peut venir de StreamingAssets aujourd'hui
/// et du cache disque demain, sans changer une ligne d'appelant.
///
public static class GltfLoader
{
public static async Task LoadAsync(string url, Transform parent, string name)
{
var import = new GltfImport();
var watch = System.Diagnostics.Stopwatch.StartNew();
if (!await import.Load(url))
{
Debug.LogError($"[GltfLoader] Chargement impossible : {url}");
return null;
}
var root = new GameObject(name);
root.transform.SetParent(parent, false);
if (!await import.InstantiateMainSceneAsync(root.transform))
{
Debug.LogError($"[GltfLoader] Instanciation impossible : {url}");
UnityEngine.Object.Destroy(root);
return null;
}
Debug.Log($"[GltfLoader] {name} chargé en {watch.ElapsedMilliseconds} ms");
return root;
}
///
/// Sur Android, StreamingAssets est à l'intérieur de l'APK : le chemin
/// est une URI jar:file://…!/assets/… que seul UnityWebRequest sait lire.
/// Sur desktop c'est un chemin de fichier ordinaire. glTFast gère les deux, à
/// condition qu'on lui passe une URI et pas un chemin concaténé à la main.
///
public static string StreamingAssetsUrl(string fileName)
{
var path = System.IO.Path.Combine(Application.streamingAssetsPath, fileName);
return path.Contains("://") ? path : new Uri(path).AbsoluteUri;
}
}
}