| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- using System;
- using LightGlue.Unity.Config;
- using LightGlue.Unity.Game;
- using LightGlue.Unity.Networking;
- using LightGlue.Unity.Roma;
- using LightGlue.Unity.Roma.Bridge;
- using LightGlue.Unity.UI;
- using UnityEngine;
- namespace LightGlue.Unity.Runtime
- {
- /// <summary>
- /// 默认适配器实现:
- /// - 不侵入插件核心,只调用现有 Manager / Bridge API
- /// - 适合业务侧通过 ILightGlueRuntime 统一调用
- /// </summary>
- public sealed class LightGlueRuntimeAdapter : ILightGlueRuntime
- {
- public event Action<LightGluePositionUpdate> OnPositionUpdate;
- //private LightGlueManager _lightGlueManager;
- private RomaManager _romaManager;
- private bool _resultSubscribed;
- public void Init()
- {
- // 若场景里有 LightGlueGameManager,它会在 Awake 里负责实例化系统预制。
- // 这里仅做存在性检查与告警,不强制创建。
- if (RomaManager.Instance == null)
- {
- Debug.LogWarning("[LightGlueRuntime] RomaManager not found. Ensure LightGlueGameManager or RomaSystem prefab exists in scene.");
- }
- if (LightGlueUIManager.Instance == null)
- {
- Debug.LogWarning("[LightGlueRuntime] LightGlueUIManager not found. Ensure LightGlueUI prefab exists in scene.");
- }
- BindResultSource();
- }
- public void StartRuntime()
- {
- var romaMgr = RomaManager.Instance;
- if (romaMgr == null) return;
- romaMgr.StartPython();
- romaMgr.StartForwardViewer();
- // 优先桥接层结果接收,避免与 RomaManager 抢占端口
- var bridge = UnityEngine.Object.FindObjectOfType<RomaHardwareToPythonBridge>();
- if (bridge != null)
- bridge.EnsureResultReceiverStarted();
- else
- romaMgr.StartResultReceiver();
- }
- public void StopRuntime()
- {
- var romaMgr = RomaManager.Instance;
- if (romaMgr == null) return;
- romaMgr.StopForwardViewer();
- romaMgr.StopResultReceiver();
- romaMgr.StopPython();
- }
- public void SetUIRuntimeMode(LightGlueUIRuntimeMode mode)
- {
- var uiMgr = LightGlueUIManager.Instance;
- if (uiMgr != null)
- {
- var uiType = mode == LightGlueUIRuntimeMode.Plugin
- ? LightGlueUIManager.UIType.Plugin
- : LightGlueUIManager.UIType.Demo;
- uiMgr.SetUIType(uiType);
- }
- }
- public void SetHardwareMode(LightGlueHardwareMode mode)
- {
- var cfg = NetworkConfigManager.LoadConfig() ?? NetworkConfig.CreateDefault();
- cfg.romaHardwareMode = (mode == LightGlueHardwareMode.Esp32)
- ? NetworkConfig.RomaHardwareMode.Esp32
- : NetworkConfig.RomaHardwareMode.OrangePi;
- NetworkConfigManager.SaveConfig(cfg);
- }
- public void ShowPluginUI()
- {
- LightGlueUIManager.Instance?.ShowUI();
- }
- public void HidePluginUI()
- {
- LightGlueUIManager.Instance?.HideUI();
- }
- private void BindResultSource()
- {
- if (_resultSubscribed) return;
- //_lightGlueManager = LightGlueManager.Instance;
- //if (_lightGlueManager != null)
- //{
- // _lightGlueManager.OnResultUpdated -= HandleResultUpdated;
- // _lightGlueManager.OnResultUpdated += HandleResultUpdated;
- // _resultSubscribed = true;
- // if (_lightGlueManager.HasLatestResult)
- // HandleResultUpdated(_lightGlueManager.LatestResult);
- // return;
- //}
- _romaManager = RomaManager.Instance;
- if (_romaManager != null)
- {
- _romaManager.OnResultUpdated -= HandleResultUpdated;
- _romaManager.OnResultUpdated += HandleResultUpdated;
- _resultSubscribed = true;
- if (_romaManager.HasLatestResult)
- HandleResultUpdated(_romaManager.LatestResult);
- }
- }
- private void HandleResultUpdated(LightGlueResult result)
- {
- var update = new LightGluePositionUpdate(
- position: result.CameraPosition,
- cameraLocation: result.CameraPosition,
- isValid: result.IsValid,
- numMatches: result.NumMatches,
- inliersRatio: result.InliersRatio);
- try
- {
- OnPositionUpdate?.Invoke(update);
- }
- catch (Exception e)
- {
- Debug.LogError(e);
- }
- }
- }
- }
|