using System.Threading.Tasks;
using UnityEngine;
namespace MyInfoMate.Vr.Scene
{
///
/// Le test qui valide , et le critère de validation n°2 de
/// l'étape S1.
///
/// Charge calibration.glb — trois branches de longueurs différentes, rouge sur +X,
/// verte sur +Y, bleue sur +Z, exprimées en coordonnées glTF — puis place trois
/// sphères aux mêmes coordonnées, en passant par la conversion du manifeste.
///
/// Chaque sphère doit coiffer le bout de sa branche. Si l'une part du côté opposé,
/// la conversion est en miroir : basculer sur
/// NegateZ et relancer. Trois longueurs différentes, parce qu'un repère
/// symétrique ne permet pas de voir une inversion.
///
public class CalibrationCheck : MonoBehaviour
{
static readonly (float[] position, Color color)[] Markers =
{
(new[] { 1.00f, 0f, 0f }, new Color(0.85f, 0.15f, 0.15f)),
(new[] { 0f, 0.60f, 0f }, new Color(0.15f, 0.75f, 0.20f)),
(new[] { 0f, 0f, 0.30f }, new Color(0.15f, 0.35f, 0.90f)),
};
public async Task RunAsync(Transform parent)
{
var model = await GltfLoader.LoadAsync(
GltfLoader.StreamingAssetsUrl("calibration.glb"), parent, "Calibration");
if (model == null)
{
Debug.LogError("[Calibration] calibration.glb introuvable dans StreamingAssets");
return;
}
foreach (var (position, color) in Markers)
{
var marker = GameObject.CreatePrimitive(PrimitiveType.Sphere);
marker.name = "Marker";
marker.transform.SetParent(parent, false);
marker.transform.localPosition = GltfSpace.Position(position);
marker.transform.localScale = Vector3.one * 0.09f;
// CreatePrimitive pose le matériau du pipeline historique : magenta sous
// URP, et dessiné sans décalage d'oeil, donc dédoublé en stéréo.
marker.GetComponent().material =
new Material(Shader.Find("Universal Render Pipeline/Unlit")) { color = color };
Destroy(marker.GetComponent());
}
Debug.Log($"[Calibration] Convention active : {GltfSpace.Axis}. " +
"Chaque sphère doit coiffer le bout de la branche de sa couleur.");
}
}
}