LightGlueRuntimeAdapter.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using System;
  2. using LightGlue.Unity.Config;
  3. using LightGlue.Unity.Game;
  4. using LightGlue.Unity.Networking;
  5. using LightGlue.Unity.Roma;
  6. using LightGlue.Unity.Roma.Bridge;
  7. using LightGlue.Unity.UI;
  8. using UnityEngine;
  9. namespace LightGlue.Unity.Runtime
  10. {
  11. /// <summary>
  12. /// 默认适配器实现:
  13. /// - 不侵入插件核心,只调用现有 Manager / Bridge API
  14. /// - 适合业务侧通过 ILightGlueRuntime 统一调用
  15. /// </summary>
  16. public sealed class LightGlueRuntimeAdapter : ILightGlueRuntime
  17. {
  18. public event Action<LightGluePositionUpdate> OnPositionUpdate;
  19. //private LightGlueManager _lightGlueManager;
  20. private RomaManager _romaManager;
  21. private bool _resultSubscribed;
  22. public void Init()
  23. {
  24. // 若场景里有 LightGlueGameManager,它会在 Awake 里负责实例化系统预制。
  25. // 这里仅做存在性检查与告警,不强制创建。
  26. if (RomaManager.Instance == null)
  27. {
  28. Debug.LogWarning("[LightGlueRuntime] RomaManager not found. Ensure LightGlueGameManager or RomaSystem prefab exists in scene.");
  29. }
  30. if (LightGlueUIManager.Instance == null)
  31. {
  32. Debug.LogWarning("[LightGlueRuntime] LightGlueUIManager not found. Ensure LightGlueUI prefab exists in scene.");
  33. }
  34. BindResultSource();
  35. }
  36. public void StartRuntime()
  37. {
  38. var romaMgr = RomaManager.Instance;
  39. if (romaMgr == null) return;
  40. romaMgr.StartPython();
  41. romaMgr.StartForwardViewer();
  42. // 优先桥接层结果接收,避免与 RomaManager 抢占端口
  43. var bridge = UnityEngine.Object.FindObjectOfType<RomaHardwareToPythonBridge>();
  44. if (bridge != null)
  45. bridge.EnsureResultReceiverStarted();
  46. else
  47. romaMgr.StartResultReceiver();
  48. }
  49. public void StopRuntime()
  50. {
  51. var romaMgr = RomaManager.Instance;
  52. if (romaMgr == null) return;
  53. romaMgr.StopForwardViewer();
  54. romaMgr.StopResultReceiver();
  55. romaMgr.StopPython();
  56. }
  57. public void SetUIRuntimeMode(LightGlueUIRuntimeMode mode)
  58. {
  59. var uiMgr = LightGlueUIManager.Instance;
  60. if (uiMgr != null)
  61. {
  62. var uiType = mode == LightGlueUIRuntimeMode.Plugin
  63. ? LightGlueUIManager.UIType.Plugin
  64. : LightGlueUIManager.UIType.Demo;
  65. uiMgr.SetUIType(uiType);
  66. }
  67. }
  68. public void SetHardwareMode(LightGlueHardwareMode mode)
  69. {
  70. var cfg = NetworkConfigManager.LoadConfig() ?? NetworkConfig.CreateDefault();
  71. cfg.romaHardwareMode = (mode == LightGlueHardwareMode.Esp32)
  72. ? NetworkConfig.RomaHardwareMode.Esp32
  73. : NetworkConfig.RomaHardwareMode.OrangePi;
  74. NetworkConfigManager.SaveConfig(cfg);
  75. }
  76. public void ShowPluginUI()
  77. {
  78. LightGlueUIManager.Instance?.ShowUI();
  79. }
  80. public void HidePluginUI()
  81. {
  82. LightGlueUIManager.Instance?.HideUI();
  83. }
  84. private void BindResultSource()
  85. {
  86. if (_resultSubscribed) return;
  87. //_lightGlueManager = LightGlueManager.Instance;
  88. //if (_lightGlueManager != null)
  89. //{
  90. // _lightGlueManager.OnResultUpdated -= HandleResultUpdated;
  91. // _lightGlueManager.OnResultUpdated += HandleResultUpdated;
  92. // _resultSubscribed = true;
  93. // if (_lightGlueManager.HasLatestResult)
  94. // HandleResultUpdated(_lightGlueManager.LatestResult);
  95. // return;
  96. //}
  97. _romaManager = RomaManager.Instance;
  98. if (_romaManager != null)
  99. {
  100. _romaManager.OnResultUpdated -= HandleResultUpdated;
  101. _romaManager.OnResultUpdated += HandleResultUpdated;
  102. _resultSubscribed = true;
  103. if (_romaManager.HasLatestResult)
  104. HandleResultUpdated(_romaManager.LatestResult);
  105. }
  106. }
  107. private void HandleResultUpdated(LightGlueResult result)
  108. {
  109. var update = new LightGluePositionUpdate(
  110. position: result.CameraPosition,
  111. cameraLocation: result.CameraPosition,
  112. isValid: result.IsValid,
  113. numMatches: result.NumMatches,
  114. inliersRatio: result.InliersRatio);
  115. try
  116. {
  117. OnPositionUpdate?.Invoke(update);
  118. }
  119. catch (Exception e)
  120. {
  121. Debug.LogError(e);
  122. }
  123. }
  124. }
  125. }